Shell操作

一、变量

1.1 单引号和双引号区别

  • 以单引号’ ‘包围变量的值时,单引号里面是什么就输出什么。
  • 以双引号” “包围变量的值时,输出时会先解析里面的变量和命令。

1.2 只读变量:readonly

readonly可以将变量定义为只读变量,只读变量的值不能被改变。
readonly myUrl

1.3 删除变量:unset

使用 unset 命令可以删除变量。
unset variable_name

1.4 变量赋值及相加

myVar=1#注意等号两边不要留空格

#输出1+1
myVar1=${myVar}+${myVar}     
echo "myVar1 = " ${myVar1}
#输出2
myVar1=$((${myVar}+${myVar}))     
echo "myVar1 = " ${myVar1}    
#输出2
myVar1=$[${myVar}+${myVar}]    
echo "myVar1 = " ${myVar1}    

1.5 let:用来执行算数运算和数值表达式测试


count=0
let count=count+1

1.6 将命令的结果赋值给变量

variable=command
variable=$(command)
ret=$(ls ${CRTDIR})
echo $ret

ret=$(cat ${CRTDIR}/test.log)
echo $ret

1.7 局部变量:local

function fun(){
    #定义局部变量
    local var2="hello local variable"
}

二、流程控制

2.1 if elif else fi /test

a=10
b=20
if [ $a == $b ]; then
   echo "a 等于 b"
elif [ $a -gt $b ]; then
    echo "a 大于 b"
elif [ $a -lt $b ]; then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi
输出:a 小于 b

if else语句经常与test命令结合使用:

num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
    echo '两个数字相等!'
else
    echo '两个数字不相等!'
fi
输出:两个数字相等!

2.2 for

2.2.1 数字循环4种方式
for((i=1;i<=10;i++));  
do   
    echo $(expr $i \* 3 + 1);  
done  

  
for i in $(seq 1 10)  
do   
    echo $(expr $i \* 3 + 1);  
done   


for i in {1..10}  
do  
    echo $(expr $i \* 3 + 1);  
done  

  
awk 'BEGIN{for(i=1; i<=10; i++) print i}'  
4
7
10
13
16
19
22
25
28
31
....
1
2
3
4
5
6
7
8
9
10
2.2.2 字符循环方式
for i in `ls`;  
do   
    echo $i is file name\! ;  
done   

  
for i in $* ;  
do  
    echo $i is input chart\! ;  
done  

  
for i in f1 f2 f3 ;  
do  
    echo $i is appoint ;  
done  
 
  
list="rootfs usr data data2"  
for i in $list;  
do  
    echo $i is appoint ;  
done  
[root@localhost local]# ./chp.sh
chp.sh is file name!
exe is file name!
logs is file name!
test.log is file name!
upload is file name!
f1 is appoint
f2 is appoint
f3 is appoint
rootfs is appoint
usr is appoint
data is appoint
data2 is appoint
2.2.3 路径查找
for file in /proc/*;  
do  
echo $file is file path \! ;  
done  

  
for file in $(ls *.sh)  
do  
echo $file is file path \! ;  
done  
/proc/version is file path !
.......
chp.sh is file path !

2.3 while/until

2.3.1 while
count=1
while(( $count<=5 ))
do
    echo $count
    let count++
done
2.3.2 until
until condition
do
    command
done
2.3.3 读取键盘信息,判断停止
echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的电影名: '
while read FILM
do
    echo "是的!$FILM 是一部好电影"
done
[root@localhost local]# ./chp.sh
按下 <CTRL-D> 退出
输入你最喜欢的电影名: test
是的!test 是一部好电影

2.4 case/esac

cecho '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1)  
    echo '你选择了 1'
    ;;
2)  
    echo '你选择了 2'
    ;;
3)  
    echo '你选择了 3'
    ;;
4)  
    echo '你选择了 4'
    ;;
*)  
    echo '你没有输入 1 到 4 之间的数字'   
    ;;
esac

2.5 无限循环

while :
do
    command
done

while true
do
    command
done

for (( ; ; ))

2.6 跳出循环

2.6.1 break

break命令允许跳出所有循环(终止执行后面的所有循环)。

while :
do
    echo -n "输入 1 到 5 之间的数字:"
    read aNum
    case $aNum in
    1|2|3|4|5) 
        echo "你输入的数字为 $aNum!"
        ;;
    *) 
        echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
        break
        ;;
    esac
done
[root@localhost local]# ./chp.sh
输入 1 到 5 之间的数字:1
你输入的数字为 1!
输入 1 到 5 之间的数字:6
你输入的数字不是 1 到 5 之间的! 游戏结束
2.6.2 continue

continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。

#!/bin/bash
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
[root@localhost local]# ./chp.sh
输入 1 到 5 之间的数字: 1
你输入的数字为 1!
输入 1 到 5 之间的数字: 6
你输入的数字不是 1 到 5 之间的!
输入 1 到 5 之间的数字: 3
你输入的数字为 3!
输入 1 到 5 之间的数字: ^C

三、命令行传递参数值值

$1	脚本后的第一串字符串
$2	脚本后的第二串字符串
$3	脚本后的第三串字符串
$#	脚本后所跟的字符串的个数
$*	脚本后跟的所有字符串,模式为“1 2 3 ”
$@	模式后跟的所有字符串,模式为“1”“2”“3”
echo $1
echo $2
echo $3
echo $4
echo $#
echo $*
echo $@
[root@localhost local]# ./chp.sh 1 2 3 
1
2
3

3
1 2 3
1 2 3

四、函数

Shell 中的函数在定义时不能指明参数,但是在调用时却可以传递参数。

2.1 函数调用(局部变量local)

var1="hello shell"
function fun(){
    #定义局部变量
    local var2="hello local variable"
    echo "在函数中 使用局部变量 var2="$var2
    echo "调用全局变量1  var1="$var1
}
fun
echo "在函数外调用 局部变量 var2="$var2
echo "调用全局变量2  var1="$var1
在函数中 使用局部变量 var2=hello local variable
调用全局变量1  var1=hello shell
在函数外调用 局部变量 var2=
调用全局变量2  var1=hello shell

五、判断与比较

5.1 文件判断

  • -e filename 如果 filename存在,则为真
  • -d filename 如果 filename为目录,则为真 
  • -f filename 如果 filename为常规文件,则为真
  • -L filename 如果 filename为符号链接,则为真
  • -r filename 如果 filename可读,则为真 
  • -w filename 如果 filename可写,则为真 
  • -x filename 如果 filename可执行,则为真
  • -s filename 如果文件长度不为0,则为真
  • -h filename 如果文件是软链接,则为真
  • filename1 -nt filename2 如果 filename1比 filename2新,则为真。
  • filename1 -ot filename2 如果 filename1比 filename2旧,则为真。
# 获取当前运行路径
CRTDIR=$(pwd)
echo "current dir " ${CRTDIR}

# 这里的-x 参数判断$myPath是否存在并且是否具有可执行权限
if [ ! -d "${CRTDIR}/exe" ]; then
    echo ${CRTDIR}/exe " not exist and mkdir"
    mkdir ${CRTDIR}/exe
fi    
chmod +x ${CRTDIR}/exe

 
# 判断是否有logs文件夹,没有则创建
if [ ! -d "${CRTDIR}/logs" ]; then
    mkdir ${CRTDIR}/logs
fi

# 判断logs文件夹下是否有upload.log文件,没有则创建
if [ ! -f "${CRTDIR}/logs/upload.log" ]; then
    touch ${CRTDIR}/logs/upload.log
fi

# 其他参数还有-n,-n是判断一个变量是否是否有值
if [ ! -n "$myVar" ]; then
    echo "myVar is empty"
fi

myVar=1
if [ -n "$myVar" ]; then
    echo "$myVar is not empty"
fi
echo "myVar = " $myVar

# 两个变量判断是否相等
if [ "$var1" = "$var2" ]; then
    echo '$var1 eq $var2'
else
    echo '$var1 not eq $var2'
fi
[root@localhost local]# ./chp.sh
current dir  /var/local
myVar is empty
1 is not empty
myVar =  1
$var1 eq $var2

5.2 整数变量表达式

-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于

5.3 字符串变量表达式

If [ $a = $b ] 如果string1等于string2,则为真,                               字符串允许使用赋值号做等号
if  [ $string1 !=  $string2 ]   如果string1不等于string2,则为真       
if  [ -n $string  ]             如果string 非空(非0),返回0(true)  
if  [ -z $string  ]             如果string 为空,则为真
if  [ $sting ]                  如果string 非空,返回0 (和-n类似) 

5.4 逻辑判断

5.4.1 逻辑非 !
条件表达式的相反
if [ ! 表达式 ]
if [ ! -d $num ]               如果不存在目录$num
5.4.1 逻辑与–a
条件表达式的并列
if [ 表达式1  –a  表达式2 ]
5.4.3 逻辑或-o
条件表达式的或
if [ 表达式1  –o 表达式2 ]

发表回复