shell历练

运算符 描述 示例

描述 示例
-efilename 如果 filename存在,则为真 [-e /var/log/syslog ]
-dfilename 如果 filename为目录,则为真 [-d /tmp/mydir ]
-ffilename 如果 filename为常规文件,则为真 [-f /usr/bin/grep ]
-Lfilename 如果 filename为符号链接,则为真 [-L /usr/bin/grep ]
-rfilename 如果 filename可读,则为真 [-r /var/log/syslog ]
-wfilename 如果 filename可写,则为真 [-w /var/mytmp.txt ]
-xfilename 如果 filename可执行,则为真 [-L /usr/bin/grep ]
filename1-nt filename2 如果 filename1比 filename2 新,则为真 [ /tmp/install/etc/services -nt/etc/services ]
filename1-ot filename2 如果 filename1比 filename2 旧,则为真 [ /boot/bzImage -otarch/i386/boot/bzImage ]

字符串比较运算符(请注意引号的使用,这是防止空格扰乱代码的好方法)

描述 示例
-zstring 如果 string长度为零,则为真 [-z $myvar ]
-nstring如果 string长度非零,则为真 [-n $myvar ]
string1= string2 如果 string1与 string2 相同,则为真 [ $myvar = one two three ]
string1!= string2 如果 string1与 string2 不同,则为真 [ $myvar != one two three ]

算术比较运算符

描述 示例
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 ]

shell 中的特殊变量

$#: shell脚本执行的时候 传递的参数个数
$?: 上一条shell命令执行完成之后的返回值
$@: 所有参数
$*: 所有参数
$1 $2 $3

sleep 3 #等3秒后执行下一条
exit num #0或者其num

变量

// 注意等号两边不能留空格,留了空格就变成一个命令+两个参数
varname=value
// 使用变量
$varname
${varname}

函数

function test()
{
  // 没有修饰的变量也是全局函数
  var="world"
  // 局部变量
  lcoal localVar="xiaomi"
}
// 调用函数
test
echo var

环境变量

是操作系统自带的,每个进程都会有

环境变量是单项传递
export varname=value 或者
varname=value
export varname

命令代换

dateTime=`date`|$(date)                                                                         
echo "dateTime is" $dateTime

算术代换

// 使用 $(()),或者$[var+3]或$[$var+3] 只能做整数运算
// $[base#n] base表示进制,n按照base进制解释
echo $[16#10+11]
[root@xxx ~]# cat 1.sh
echo 1+1 |bc
echo 5*2 |bc
echo 1.24*2 |bc
echo 1.24/0.2 |bc

分支结构

if 命令|条件测试
then
  xxxxx
elif 命令2|条件测试 ; then
  xxxxx
else // else不用加then
  xxxxx
fi

示例

echo "Is it morning? Please answer yes or no."
# 读取用户的输入
read YES_OR_NO
if [ "$YES_OR_NO" == "yes" ]
then
    echo "Good morning!"
elif [[ "$YES_OR_NO" == "no" ]]
then
    echo "Good afternoon!"
else
    echo "Sorry,$YES_OR_NO not recognized. Enter yes or no."
fi 

case 表达式

#!/bin/bash
read -p "请输入一个字符,并按enter确认:"  KEY
case "$KEY" in
        [a-z]|[A-Z])
                echo "您输入的字符为字母"
                ;;
        [0-9])
                echo "您输入的字符为数字"
                ;;
*)
        echo "您输入的是空格、功能键或其他控制字符"
esac

for循环

  • 方式0
for((i=1;i<10;i++));
do
echo $i
done
  • 方式1
let num
for i in `seq 100`
do
    num=$[num+i]                                                                    
done
echo $num
  • 方式2
for i in `ls`
do
    if [ -d $i ]
    then
        echo "$i 是目录"
    elif [ -f $i ]                                                                      
    then
        echo "$i 是文件"
    else
        echo "我不猜了"
    fi  
done
  • 方式3
awk 'BEGIN{for(i=1; i<=10; i++) print i}'
  • 方式4 (路径查找)
for file in /proc/*;
do
echo $file
done
  • 方式5
for file in $(ls *.sh)
do
  echo $file
done
  • 方式6
for i in {1..10}
do 
  echo $i
done

while

while [ $i -le 100 ]
do
  let sum=sum+$i
  let i++
done

posted on 2021-06-16 14:14  lodger47  阅读(30)  评论(0)    收藏  举报

导航