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
浙公网安备 33010602011771号