shell入门

1.变量

1)定义变量
slbl=hb  //变量名只能用字母数字下划线
for filename in `ls /etc` // 赋值为/etc下所有文件名
for filename in $(ls /etc)
2)使用变量
echo ${slbl} 或 echo $slbl //输出变量

for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done
//循环输出变量

3)只读变量
readonly zdbl  //变量值不能修改

4)删除变量
unset slbl


shell字符串
//字符串有单引号和双引号 单引号里不能加转义符 双引号里面可以
str1='hb'
str2="hb"$str1"!"
echo ${#str1}    //获取字符串长度
echo ${str2:1:4} //截取下标1长度4字符串
echo `expr index "$str2" io` //获取字符串中字符i或o第一个出现的下标


shell数组
array_name=(value0 value1 value2 value3)或
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

valuen=${array_name[n]}//读取数组
length=${#array_name[@]}//取得数组元素的个数
或者
length=${#array_name[*]}
lengthn=${#array_name[n]}//取得数组单个元素的长度
${my_array[*]}  //数组所有元素
或${my_array[*]}


 

2.传递参数

./xx.sh 1 2 3  //执行脚本时加上参数
脚本中echo $0  //$0是脚本名称xx.sh
echo $1  //$1是第一个参数1 $2 $3等依此类推
$#   //参数个数 这里是3
$*    //以一个字符串显示所有参数 空格隔开
$@   //以多个字符串形式显示参数
      例:  echo "-- $@ 演示 ---"
    for i in "$@"; do
        echo $i
    done

3.基本运算符

1)算数运算expr
val=`expr 2 + 2`  //expr 表示计算 2与+间要有空格 ``是反引号不是''
例:`expr $a + $b`  //加法
    `expr $a - $b`    //减法
    `expr $a * $b`    //乘法 乘法需要用转意符
    `expr $b / $a`     //除法
    `expr $b % $a`    //取余
    a=$b                    //赋值
    [ $a == $b ]         //判断是否相等
    [ $a != $b ]            //判断是否不相等


2)关系运算    //只支持数字 不支持字符串
[ $a -eq $b ]     //是否相等
[ $a -ne $b ]    //是否不相等
[ $a -gt $b ]    //是否大于
[ $a -lt $b ]    //是否小于
[ $a -ge $b ]    //是否大于等于
[ $a -le $b ]     //是否小于等于


3)字符串运算    //支持字符串
[ $a = $b ]     //是否相等
[ $a != $b ]     //是否不相等
[ -z $a ]         //字符串长度是否为0 0返回true
[ -n "$a" ]     //字符串长度是否不为0 不为0返回true
[ $a ]             //字符串是否为空 不为空返回true


4)逻辑运算符
[[ $a -lt 100 && $b -gt 100 ]]     //&&与
[[ $a -lt 100 || $b -gt 100 ]]       //||或


5)文件测试运算符 (是返回true)
[ -b $file ]    //文件是否是块设备文件
[ -c $file ]     //文件是否是字符设备文件
[ -d $file ]   //文件是否是目录
[ -f $file ]     //文件是否是普通文件(既不是目录,也不是设备文件)
[ -g $file ]    //文件是否设置了 SGID 位
[ -k $file ]    //文件是否设置了粘着位(Sticky Bit)
[ -p $file ]    //文件是否是有名管道
[ -u $file ]    //文件是否设置了 SUID 位
[ -r $file ]    //文件是否可读
[ -w $file ]    //文件是否可写
[ -x $file ]    //文件是否可执行
[ -s $file ]     //文件是否为空(文件大小是否大于0)
[ -e $file ]     //文件(包括目录)是否存在
    

4.test命令  

//用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试

1)数值测试(只适用于数字对比)
-eq    //等于则为真
-ne    //不等于则为真
-gt    //大于则为真
-ge    //大于等于则为真
-lt    //小于则为真
-le    //小于等于则为真
例:     if test $[num1] -eq $[num2]
    then
        echo '两个数相等!'
    else
        echo '两个数不相等!'
    fi


2)字符串测试(只适用于字符串对比)
=    //等于则为真
!=    //不相等则为真
-z 字符串    //字符串的长度为零则为真
-n 字符串    //字符串的长度不为零则为真
例:    if test $num1 = $num2
    then
        echo '两个字符串相等!'
    else
        echo '两个字符串不相等!'
    fi


3)文件测试
-e 文件名    //如果文件存在则为真
-r 文件名    //如果文件存在且可读则为真
-w 文件名    //如果文件存在且可写则为真
-x 文件名    //如果文件存在且可执行则为真
-s 文件名    //如果文件存在且至少有一个字符则为真
-d 文件名    //如果文件存在且为目录则为真
-f 文件名    //如果文件存在且为普通文件则为真
-c 文件名    //如果文件存在且为字符型特殊文件则为真
-b 文件名    //如果文件存在且为块特殊文件则为真
例:if test -e ./bash
    then
        echo '文件已存在!'
    else
        echo '文件不存在!'
    fi

5.shell流程控制

1)if
例:
    if [ $(ps -ef | grep -c "ssh") -gt 1 ]
    then 
        echo "true" 
    elif        
        echo "xx"
    else
        echo "xxx"
    fi


2)for循环
例:
for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done


3)while循环
例:
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done


4)until循环 
//until 循环执行一系列命令直至条件为 true 时停止。
//false继续执行 与while相反
例:
a=0
until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done


5)case
//case匹配某一项执行
例:
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
    3)  echo '你选择了 3'
    ;;
    4)  echo '你选择了 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
esac

6.函数

例:
demoFun(){
    echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"

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

7.输入输出重定向

以下的>>//合并原文件
和>//覆盖原文件
可以替换

1)输出重定向    //输出到文件中
$ echo "菜鸟教程:www.runoob.com" > users
$ cat users
菜鸟教程:www.runoob.com

如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾,例如:
$ echo "菜鸟教程:www.runoob.com" >> users
$ cat users
菜鸟教程:www.runoob.com
菜鸟教程:www.runoob.com


2)输入重定向    //从文件获取输入
例://统计users文件行数
wc -l users 或 wc -l < users


3)输出错误文件
command 2>>file  //输出错误文件 2表示错误文件 1输出文件 0输入文件
command >> file 2>&1    //将 输出文件 和 错误文件 合并后重定向到file
原文地址:https://www.cnblogs.com/hbhb/p/14272991.html