Shell基础语法

循环

while循环

  • while死循环
1
2
3
4
5
while true
do
    echo "whle loop"
    sleep 10
done

for循环

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 范围循环
for i in {9..20};do
    echo ${i}
done
# 9 - 20

# 另一种循环
items="app banana"
for item in ${items};
do
    echo ${item}
done

# 循环读取
lines=$(cat /etc/message)
echo "${lines}" | while read line
do
    echo "line is ***${line}***"
done

判断

  • 判断字符串是否相等。字符串后面再跟一个x,用于防止当${value}为空时抛出异常
1
2
3
4
value="hello"
if [ "${value}"x = "hello"x ];then
    echo "equal"
fi
  • 判断文件是否存在
1
2
3
if [ -z '/path/to/file' ];then
    echo "file exist"
fi
  • 判断文件夹是否存在
1
2
3
if [ -d "/path/directory" ];then
    echo "directory exist"
fi
  • 判断数值是否相等
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# -eq 相等
# -lq 小于
# -gq 大于
v=2
if [ ${v} -eq 2 ];then
    echo "equal"
elif [ ${v} -lq 2 ];then
    echo "less than 2"
else
    echo "grant than 2"
fi

sed

sed指令太强大,单独列个标题说下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
cat >> 1.txt << EOF
good test
1
2
3
4
5
6
bbbb
aaaa
EOF
# 删除匹配'test'的该行以及该行之后6行
sed -ri "/test/,+6d" 1.txt

奇技淫巧

  • 变量引用变量
1
2
3
4
5
HOST_DEV="test.domain.com"
env="dev"
hostname=$(eval "echo \${HOST_${env}}")
echo ${hostname}
# test.domain.com
  • 浮点数计算
1
sum=$(echo "scale=2;5+2.1" | bc)
  • 大小写互换
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
v="test"
# 大写第一个字符
echo ${v^} #Test
# 大写所有字符
echo ${v^^} #TEST

v="TEST"
# 小写第一个字符
echo ${v,} #tEST
# 小写所有字符
echo ${v,,} #test
  • 计算时使用变量
1
2
3
total=1
count=2
sum=$(echo "scal=5;$total+$count" | bc)