shell
基础语法
变量:test="hhhh"
,注意赋值的等号前后不能有空格,不然可能识别为等值判断
使用变量:echo "the string is" ${test}
数组
-
arrname[1]=1;arrname[4]="hhh"
数组成员类型可以不同且没有长度限制,也可以一次性定义array_name=(value0 value1 value2 value3)
-
arrname[@]
和arrname[*]
两个都表示数组的所有值,也都可在里面遍历@和*的对比主要是前者输出是行,后者输出以空格隔开
-
可以使用循环for遍历
for i in ${arr[@]} do echo ${i} done
-
获取长度
echo ${#arr[@]}
,下标使用*号也可以
字符串
- 和python一样支持截取
echo ${hhh:1:3}
,打印字符串1到3的索引 - 打印字符串长度
echo ${#hhh}
- 获取指定字符的匹配索引
echo `expr index "${hhh}" "1"`
注意不是单引号是反引号
特殊符号
{}
:用来包围,界定范围,可以不加,但是为了方便界定和阅读最好加上()
:括号内如果是代码则会执行;egfor i in $(ls ../); do echo ${i} ; done;
,会把ls
的执行结果遍历打印出来- 单引号和双引号,单引号内部所有字符没有任何效果,双引号则相反,都可以用于字符串合并,eg
result:arr[1]=1 arr[5]="jijojo" arr[3]="jise" hhh='test'${arr[3]}"test"${arr[1]} echo $hhh
testjisetest1
循环&判断
-
for
for i in ${arr[*]} do echo ${i} done
写成一行
for i in ${arr[*]} ;do [command 1] ;[command 2] ;...;done;
,egfor i in ${arr[*]} ;do echo ${i};echo hhhhhh;done;
注意写一行的时候分号需要加的位置,除了do后面之外基本都要加
其中遍历对象也可以是常用linux指令的输出值,只要输出方式是遍历输出就可以,如下
for i in $(ls ../) do echo "the file name is :" ${i} done
上面可以指定路径下的文件名遍历。或者可以直接用参数遍历
for i in 1 2 3 4 do echo ${i} done
能够顺序打印出定义的数字
-
if
if [[ $1 = $2 ]] then echo "equal" ... elif then ... else echo "noeq" ... fi
同样可以写成一行
if [[ $1 = $2 ]];then echo "equal" ;else echo "noeq";fi;
分号规则和for是类似的,另外只有出了fi才算结束判断过程,要运行多个指令可以直接插入(如上省略号)。此外,如果在使用[[
作为判断界定时,有时候会收到[[: not found
的错误,这是因为使用sh [shell.sh]
语法导致的,在一些系统里面默认使用dash作为sh指令的实现而不是bash,解释器的差异导致了这个问题,但如果直接使用./[shell.sh] 执行时又不会报错判断规则参考
关系运算符
Shell 中的中括号用法总结主要掌握
[[ -n $arg ]]
:arg非空,以下省略双括号关系运算
运算符 说明 举例 -eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。 -ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。 -gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。 -lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。 -ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。 -le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。 字符串运算
运算符 说明 举例 = 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。 != 检测两个字符串是否不相等,不相等返回 true。 [ $a != $b ] 返回 true。 -z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。 -n 检测字符串长度是否不为 0,不为 0 返回 true。 [ -n “$a” ] 返回 true。 $ 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。 文件操作
操作符 说明 举例 -b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。 -c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。 -d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。 -f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。 -g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。 -k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。 -p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。 -u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。 -r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。 -w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。 -x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。 -s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。 -e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。 -
while
while condition do command done
无限循环
while : ....
-
break 和 continue的使用和c差不多
breakwhile : do echo -n "输入 1 到 5 之间的数字:" read aNum case $aNum in 1|2|3|4|5) echo "你输入的数字为 $aNum!" ;; *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束" break ;; esac done
continue
while : do echo -n "输入 1 到 5 之间的数字: " read aNum case $aNum in 1|2|3|4|5) echo "你输入的数字为 $aNum!" ;; *) echo "你输入的数字不是 1 到 5 之间的!" continue echo "游戏结束" ;; esac done
函数
- 定义
返回值只可以是【0-255】的数值,超过了就重新计数,可以跨文件调用,返回值可以是符合范围的数值参数[ function ] funname [()] { action; [return int;] }
return $value
示例
test.sh
获取返回值通过. ./test2.sh echo "my first function" demoFun hhhh echo "end of demo function ret ="$? otherFun jiii echo "end of other function ret ="$?
$?
test2.sh
获取传入参数和一般的获取参数一样使用${n}demoFun(){ echo "这是我的第一个 shell 函数!" echo "the value is"${1} return 2 } otherFun(){ echo "the next function value"${1} h=122 return $h }
result
注意,每次通过my first function 这是我的第一个 shell 函数! the value ishhhh end of demo function ret =2 the next function valuejiii end of other function ret =122
$?
得到返回值的时候,要第一时间保存,不然会被覆盖
其他相关的参数处理特殊字符参数处理 说明 $# 传递到脚本或函数的参数个数 $* 以一个单字符串显示所有向脚本传递的参数 $$ 脚本运行的当前进程ID号 $! 后台运行的最后一个进程的ID号 $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。 $- 显示Shell使用的当前选项,与set命令功能相同。 $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
算术计算
尽管在sh里面用算数计算少,但还是记录下
- 使用expr指令后可以用于计算
expr 1 + 2
,可以参数化````expr ${1} + ${2}` ```注意空格的使用,没有空格就成字符串连接了。 - 使用括号包围
相当于执行命令,所以可以用于计算
1 , {1}, 1,{2}是文件输入参数来的,相当于可以用来计算传递给函数的值。也能写复杂的计算公式h=$((${1}+${2})) echo "the value "$h
echo "the value is " $((10*(39+1)+365/5))
注释
#
- 使用包围
其中的感叹号可以替换成其他符号:<<! 要被注释的内容 ... !
注意点
- shell 对 空格和
;
的要求很高,等号前后没有空格是赋值,有空格是比较,所以允许一个等号的对比[[ $num1 = $num2 ]]
- 在使用变量的时候,变量结构前后最好有空格,不然会报错
egif [[${num} = ${num2}]]
,这样是会报错的,因为[[${num}
在运行后变成[[num
导致语法错误
shell 重定向
文件包含
使用.
来引入.sh文件,eg . ./test.sh
将同目录下的test.sh文件引入,这样就能使用test.sh里面的东西