shell 编程记录

1 文件比较运算符 -e filename 如果 filename存在,则为真 [ -e /var/log/syslog ] -d filename 如果 filename为目录,则为真 [ -d /tmp/mydir ] -f filename 如果 filename为常规文件,则为真 [ -f /usr/bin/grep ] -L filename 如果 filename为符号链接,则为真 [ -L /usr/bin/grep ] -r filename 如果 filename可读,则为真 [ -r /var/log/syslog ] -w filename 如果 filename可写,则为真 [ -w /var/mytmp.txt ] -x filename 如果 filename可执行,则为真 [ -L /usr/bin/grep ] filename1-nt filename2 如果 filename1比 filename2新,则为真 [ /tmp/install/etc/services -nt /etc/services ] filename1-ot filename2 如果 filename1比 filename2旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]

2 字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法) -z string 如果 string长度为零,则为真 [ -z "$myvar" ] -n string 如果 string长度非零,则为真 [ -n "$myvar" ] string1 = string2 如果 string1与 string2相同,则为真 [ "$myvar" = "one two three" ] string1 != string2 如果 string1与 string2不同,则为真 [ "$myvar" != "one two three" ]

shell脚本对空格有严格的规定,赋值语句等号两边不能有空格,而字符串比较,等号两边必须有空格

= 与 == 在 [ ] 中表示判断(字符串比较)时是等价的

3 算术比较运算符(只支持数字,不支持字符串,除非字符串的值是数字) num1-eq num2 等于 [ 3 -eq $mynum ] num1-ne num2 不等于 [ 3 -ne $mynum ] num1-lt num2 小于 [ 3 -lt $mynum ] num1-le num2 小于或等于 [ 3 -le $mynum ] num1-gt num2 大于 [ 3 -gt $mynum ] num1-ge num2 大于或等于 [ 3 -ge $mynum ]

4 单引号和双引号的区别

单引号,不进行展开 双引号会展开

5 local用来定义局部变量, 一般用在函数里面 let 用来进行数学运算。

在函数内部定义的变量, 如果没有加local, 也是全局变量

6 shell函数定义,前面可以加function也可以不加。 调用函数时:函数名 $1 $2 ...s 参数个数 : $# 所有参数内容 :$@ $? : 上个命令的退出状态,或函数的返回值。

7 source sh ./区别

source 在当前shell内去读取、执行a.sh,而a.sh不需要有"执行权限"

sh 都是打开一个subshell去读取、执行a.sh,而a.sh不需要有"执行权限" .通常在subshell里运行的脚本里设置变量,不会影响到父shell的。

./ 打开一个subshell去读取、执行a.sh,但a.sh需要有"执行权限"

8 export export表示将当前shell的变量输出出去, 在新建shell时将会拷贝这些变量 对于同一个shell的不同脚本之间,不需要 export也可以相互访问变量 export的变量,才能在env显示出来

9 dirname //获取脚本所在的文件夹路径 cd $(dirname $0) DIR=$(pwd)

10 basename name=$(basename $0)

11 ``倒引号, 单引号'', 双引号 "", 小括号(), 大括号{}

倒引号 : 如果被“倒引号”括起来, 表示里面需要执行的是命令。比如 `dirname $0`, 就表示需要执行 dirname $0 这个命令

双引号 : 被双引号括起来的内容, 里面 出现 $ (美元号: 表示取变量名) `(倒引号: 表示执行命令) \(转义号: 表示转义), 其余的才表示字符串。 单引号 : 它会忽略所有被引起来的字符的特殊处理,被引用起来的字符会被原封不动的使用,唯一需要注意的点是不允许引用自身

() 表示里面是需要执行的命令 , 比如echo $(ls) , 表示先执行ls; 等价于echo `ls`

{} 限定变量范围 echo $aa_AA echo ${aa}_AA

12 统计文件行数 find /demo -name "*.js" |xargs cat|grep -v ^$|wc -l

13 =赋值号前后不能有空格

14 变量命名不能使用系统命令

15 if语句

基本用法

if [ command ];then

符合该条件执行的语句

elif [ command ];then

符合该条件执行的语句

else

符合该条件执行的语句

fi

then 与 if写在同一行时,要用; 隔开。

test [] [[]]区别

[]和test

两者是一样的,在命令行里test expr和[ expr ]的效果相同。

test的三个基本作用是判断文件、判断字符串、判断整数。支持使用 ”与或非“ 将表达式连接起来。

test中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq, -gt这种形式。

无论是字符串比较还是整数比较都千万不要使用大于号小于号。当然,如果你实在想用也是可以的,对于字符串比较可以使用尖括号的转义形式, 如果比较"ab"和"bc":[ ab \< bc ],结果为真,也就是返回状态为0.

[[ ]] 这是内置在shell中的一个命令,它就比刚才说的test强大的多了。支持字符串的模式匹配(使用=~操作符时甚至支持shell的正则表达 式)。逻辑组合可以不使用test的-a,-o而使用&& ||。 字符串比较时可以把右边的作为一个模式(这是右边的字符串不加双引号的情况下。如果右边的字符串加了双引号,则认为是一个文本字符串。),而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。

注意:使用[]和[[]]的时候不要吝啬空格,每一项两边都要有空格,[[ 1 == 2 ]]的结果为“假”,但[[ 1==2 ]]的结果为“真”!

16 case语句

case $变量名 in 模式1) 命令序列1 ;; 模式2) 命令序列2 ;; *) 默认执行的命令序列 ;; esac

17 for 语句

for i in {1..10}

do

要执行的命令序列1

要执行的命令序列2

done

18 while

while [ $i -le 100 ] //判断语句 do let sum=sum+$i let i+=2 done

19 函数

定义函数

[funtion] funname() {

xxxx

}

调用

funname

函数参数符号说明

$# 传递到脚本的参数个数 $* 以一个单字符串显示所有向脚本传递的参数 $$ 脚本运行的当前进程ID号 $! 后台运行的最后一个进程的ID号 $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。 $- 显示Shell使用的当前选项,与set命令功能相同。 $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

19 shell脚本包含别的脚本

使用. 或者 source命令

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券