shell脚本学习

写在开头:很多我原来会的就不写了(很基本的命令),这里写些自己感觉会用到的,重要的命令

基本linux命令

  • cp -i file newFile
    -i强制shell询问是否覆盖已有文件, mv -i , rm -i命令也会给出提示,同上
  • cp -R file newFile
    -R递归复制整个目录
  • rm -f强制删除
    rm -r对rm命令来说,-r和-R效果一样,可以递归删除
  • mkdir -p /asdad/dasdad/。。。同时创建多个目录和子目录
  • cat命令
    • -n所有行加上行号
    • -b文本加上行号
    • -T替换掉制表符
  • more命令:翻页

shell命令

  • ps -ef探索进程(很多命令,不详述)
    top实时监测
  • df -h查看磁盘空间
  • du显示特定目录内的磁盘使用
    • -c已列出文件总大小
    • -h易读的,K,M,G等
    • -s显示每个输出参数的总计
  • sort排序,默认当作字符
    • -n作为数字识别
    • -M识别三字符的月份
      还有很多很多的排序命令,套用格式。
sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件]

参数说明:
-b 忽略每行前面开始出的空格字符。
-c 检查文件是否已经按照顺序排序。
-d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
-f 排序时,将小写字母视为大写字母。
-i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
-m 将几个排序好的文件进行合并。
-M 将前面3个字母依照月份的缩写进行排序。
-n 依照数值的大小排序。
-o<输出文件> 将排序后的结果存入指定的文件。
-r 以相反的顺序来排序。
-t<分隔字符> 指定排序时所用的栏位分隔字符。
+<起始栏位>-<结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
--help 显示帮助。
--version 显示版本信息。

理解shell

理解shell外部命令和内建 命令
history命令
。。。。


shell脚本

  • echo
    * -n保证字符串尾部有一个空格,则文本和命令输出就会显示在一行

变量的使用,直接使用$加变量名来使用
用户变量区分大小写,使用等号进行赋值;便改良,等号和值之间不能有空格。

从命令输出中提取信息,并将其赋予便变量:反引号或者$()

TEST=`date`
TEST=$(date)	

>输入输出重定向,双大于号标识追加,一个就是覆盖

|管道符(管道符串起来的命令是同事运行的,不是依次)

数学运算:expr 5 * 2
使用美元符和方括号将数学表达式围起来
var1=$(1 + 5)
PS:shell只支持整数运算,浮点的这里先不讲,用到了再研究吧

退出状态码:shell命令跑完了,都会使用一个退出状态码,0~255的整数,记住0代表命令成功结束
echo $?获取最后一条命令的退出状态码


结构化命令

if command
then
	commands
fi

或者

if commandl; then
	commands
fi

if命令的退出状态码为0,就与i那些then内的命令

还有if-then-else命令

if command
then
	commands
else
	commands
fi

if之间可以嵌套
还有可以使用else的另一种形式:elif,即可以书写多个if-then语句

if command1
then
	commands
elif command2
then
	commands
fi

test命令:条件成立,返回退出状态码0,不成立,就是非0

if [ condition ]
then
	commands
fi

方括号定义了一个测试条件。
注意:第一个方括号之后和第二个方括号之前都必须有一个空格。否则报错。
test命令可以判断三类条件:数值比较、字符串比较、文件比较

数值比较

参数 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真

实例:

num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

字符串比较

参数 说明
= 等于则为真
!= 不相等则为真
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真
> 大于为真
< 小于为真

说明:

  • 比较字符串相等时,比较测试会把所有的标点和大小写情况都考虑进去
  • 大于号和小于号在使用的时候必须转义,否则会把其当作重定向,字符串当作文件名
  • 大于和小于号和sort命令采用的不同,测试命令中,大写字母被认为小于小写字母,但是sort不同

文件比较

参数 说明
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真
  • 复合条件查询:if-then允许你使用布尔逻辑组合测试
    * [ condition1 ] &&[ condition2 ]
    * [ condition1 ] || [ condition2 ]
  • if-then高级特性:
    * 用于数学表达式的双括号(++、–、&&等)
    * 用于高级字符串功能处理的双方括号(模式匹配)

case命令

可以通过竖线操作符在一行中分割出多个模式

case 值 in
模式1 | 模式3)
    commands ;;
模式2)
   commands ;;
esac

for命令

for var in item1 item2 ... itemN
do
    commands
done
  • 可以单纯从一个列表中循环读取,列表可以是数字列表或者字符串列表
    其中数字列表中,单引号会很麻烦,解决方法是:
    使用转义;使用双引号来定义用到单引号的值(就是把值用双引号框起来)
  • 当然也可以从命令中读取值,比如 cat $file输出的值
  • 使用通配符来读取目录,看例子:
for file in /data/*
do
	if [ -d "$file" ]
	then
		echo "$file is a directory"
	fi
done
  • C语言风格的for命令
    for (( variable assigment ; condition ; iteration process ))
    for(( a = 1;a < 10; a++))
  • 注意以下几点:
    变量赋值可以有空格
    条件中的变量不以美元符开头
    迭代过程的算是未用expr命令格式
  • 使用多个变量,循环会单独处理每个变量,但是条件只有一种!
    for (( a=1, b=10;a<=10;a++,b-- ))

while命令

while test command
do 
	other commands
done

while允许你使用多个测试命令。只有最后一个测试命令的退出状态码会被用来决定什么时候结束循环
这种用法要注意:每次迭代中所有的测试命令都会被执行,包括测试命令失败的最后一次迭代;还有注意,每个测试命令都单独出现在单独的一行上。

until命令

until命令和while命令工作方式完全相反。until要求你指定一个通常返回非零退出状态码的测试命令,只有测试命令的退出状态码不为零,shell才会执行列出的命令,一旦变成0,命令也就结束了

和while命令类似,你也可以在until命令语句中放入多个测试命令。

其他说明

循环可以嵌套
循环处理文件数据(使用嵌套和修改IFS环境变量)看例子:

IFS.OLD=$IFS
IFS=$'\n'
for entry in $(cat /etc/passwd)
do 
	echo "values in  $ebtry -"
	IFS=:
	for value in $entry
	do
		echo "  $value"
	done
done

这个脚本使用两个不同的IFS来解析数据,第一个得出文件中的单独的行,第二个使用冒号分割,得到单独的值。

控制循环

指的的break命令和continue命令

breake n跳出外部循环的命令,其中n标识要跳出的循环的层级。
默认情况下,n为1,表明跳出当前循环,如果你设置成2,就会停止下一步的外部循环。

处理循环的输出:可以对循环的输出使用管道或者进行重定向,通过在done命 令后添加一个处理命令来实现。

你可能感兴趣的:(shell脚本)