Linux常用shell语法和命令

If else

Shell共有三种三种if…else分支

  • if…fi语句
  • if…else…fi语句
  • if…elif…else…fi语句

1、if…else语句

if [ expression ]
    then
Statement(s) to be executed if expression is true
fi

注意:expression 和方括号([ ])之间必须有空格,否则会有语法错误。

if…else也可以写成一行,以命令的方式来运行,像这样:

if test $[2*3] -eq $[1+5]; then echo 'The two numbers are equal!'; fi;

2、if条件表达式中的额外判断

字符串的判断
  • str1 = str2 两个字符串有相同内容、长度时为真
  • str1 != str2
  • -n str1 字符串的长度大于0返回真
  • -z str1 字符串的长度等于0时返回真
  • str1 字符串为非空返回真

比较两个字符串是否相等的时候,一般的做法是:

if [ "$test"x = "test"x ]; then 

主要考虑以下几点

  • 使用单个等号
  • 注意到等号两边各有一个空格:这是unix shell的要求
  • 注意到” test"xx test为空的时候,上面的表达式就变成了x = testx,显然是不相等的。而如果没有这个x,表达式就会报错:[: =: unary operator expected
数字的判断
  • int1 -eq int2 两数相等返回真
  • int1 -ne int2 两数不相等返回真
  • int1 -gt int2 int1大于int2为真
  • int1 -ge int2 int1大于等于int2为真
  • int1 -lt int2 int1小于int2为真
  • int1 -le int2 int1小于等于int2为真
复杂逻辑判断
  • -a 与
  • -o 或
  • ! 非
文件的判断
  • -e filename 如果 filename存在,则为真
  • -d filename 如果 filename为目录,则为真
  • -f filename 如果 filename为常规文件,则为真
  • -L filename 如果 filename为符号链接,则为真
  • -r filename 如果 filename可读,则为真
  • -w filename 如果 filename可写,则为真
  • -x filename 如果 filename可执行,则为真
  • -s filename 如果文件长度不为0,则为真

判断/home/oicq/script/get_random_shm_key.sh是否存在

if [ -e /home/oicq/script/get_random_shm_key.sh ]

判断文件大小是否为空

if [ ! -s ${REMOTE_FILE} ]
    then
        SH_error_msg "${REMOTE_FILE} file is empty"
        return 1
    fi

循环

For

for循环的一般格式为:

for 变量 in 列表
do
    command1
    command2
    ...
    commandN
done

列表 是一组值(数字,字符串等)组成的序列,每个值通过空格分隔。每循环一次,就将列表中的下一个赋给变量。

in 列表是可选的,如果不用它,for 循环使用命令行的位置参数

  • 顺序输出当前列表中的数字
for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

运行结果如下:

The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5
  • 1到100输出
for i in {
  1..100}  
do  
    echo $i  
done  
  • 显示主目录下以.bash开头的文件
#!/bin/bash
for FILE in $HOME/.bash*
do
   echo $FILE
done

运行结果如下:

/root/.bash_history
/root/.bash_logout
/root/.bash_profile
/root/.bashrc

while

while循环的一般格式为:

while 条件语句

do

action

done;

示例:从文件中读取内容

while read line;do
    echo $line;
done < /etc/hosts;

替换

1、命令替换

命令替换$(cmd)以及`cmd`

$ ls 
a b c 
$ echo $(ls) 
a b c 
$ echo `ls` 
a b c

对于echo $(ls),shell执行时会先执行$(ls),得到其标准输出,在用得到输出替换原来位置上的$(ls),再执行echo命令。

注意:$(cmd)中的命令的错误输出是不会被替换的,只有标准输出

$ var=$(cat d)
cat: d

这里由于文件d在当前目录不存在

2、一串命令的执行()和{}

(){}都是对一串的命令进行执行,但是有所区别:

  • ()只是对一串命令重新开一个子shell进行执行
  • {}对一串命令在当前shell执行
  • (){}都是把一串的命令放在括号里面,并且命令之间用;号隔开
  • ()最后一个命令可以不用分号
  • {}最后一个命令要用分号
  • {}的第一个命令和左括号之间必须要有一个空格
  • ()里的各命令不必和括号有空格
  • (){}中括号里面的某个命令的重定向只影响该命令,但括号外的重定向则影响到括号里的所有命令
$ var=test 
$ (var=notest; echo $var) ###变量var值为notest,此是在子shell中有效 
notest 
$ echo $var ###父shell中值仍为test 
test 
$ { var=notest; echo $var;} ###注意左括号和var之间要有一个空格 
notest 
$ echo $var ###父shell中的var变量的值变为了notest 
notest 
$ { var1=test1;var2=test2;echo $var1>a;echo $var2;} ###输出test1被重定向到文件a中, 
test2 ###而test2输出则仍输出到标准输出中。 
$ cat a 
test1 
$ { var1=test1;var2=test2;echo $var1;echo $var2;}>a ###括号内命令的标准输出全部被重定向到文件a中
$ cat a 
test1 
test2

变量

1、shell中 0, 1等变量

  • $$:shell本身的PID
  • $?:shell最后运行的命令的结束代码
  • $*:所有参数列表,如果使用”“括起来的话,会以” 1 2 …$n”形式输出
  • $@:所有参数列表,如果使用”“括起来的话,会以” 1 2” … “$n”形式输出**
  • $#:添加到shell的参数个数
  • $0:shell本身文件名
  • 1  n:添加到shell的各个参数值

@在不加引号的时候,都可以表示一个参数数组;而在加了引号之后,” "" @”依然表示一个参数数组

${var%pattern},表示从变量$var的结尾删除最短匹配pattern的子串

${0%/*}表示删除从变量 0

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值