变量

定义和删除

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 定义变量(注意等号两边不能有空格) user=123

# 使用变量(使用花括号确定变量边界)
echo ${user}
echo "my age is ${user}old"

# 只读变量
readonly user

# 删除变量
unset user

作用域

  1. 局部变量:脚本或命令中定义,仅在当前shell实例中有效

  2. 环境变量:所有程序可以访问

  3. shell变量:shell程序设定的特殊变量

类型

字符串

单引号

  • 单引号的任何字符都原样输出,字符串中的变量是无效的
  • 不能出现单独的单引号,转义也不行,必须成对出现

双引号

  • 可以有变量

  • 可以出现转义字符 拼接 ```shell user=‘wengwei’

    单引号 gretting=‘hello, ‘${user}’ !’

双引号 gretting=“hello, ${user} !”

1
2
3
4
echo ${#string} ``` **提取子串** ```shell string="my name is wengwei"
echo ${string:1:4} ``` **执行** ```shell string="my name is wengwei"
# 注意这里的 反引号
echo `expr index "${string}" io`

数组 bash支持一维数组,不支持多维数组,并且没有限定数组的大小 ```shell array=(123 234 345) array[3]=456 array[4]=567

echo ${array[0]} echo ${array[@]} len=${#array[@]} echo ${len}

1
2

## 参数传递

shell echo “Shell 传递参数” echo “执行文件名 $0” echo “第一个参数 $1” echo “第二个参数 $2” echo “第三个参数 $3” echo “总数 $#” echo “脚本运行当前进程号 $$” echo “脚本后台运行最后一个进程的ID号 $!” echo “脚本运行退出状态 $?”

这里所有参数会拼接成一个字符串

echo “所有参数 $*” echo “所有的输入参数 $@”

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163

## 运算 ```shell a=10 b=20
# 加减乘除 val=`expr $a + $b`
echo "a + b : $val" val=`expr $a - $b`
echo "a - b : $val" val=`expr $a \* $b`
echo "a * b : $val" val=`expr $b / $a`
echo "b / a : $val" val=`expr $b % $a`
echo "b % a : $val"

# 比较
if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等于 b"
else
   echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
   echo "$a -ne $b: a 不等于 b"
else
   echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
   echo "$a -gt $b: a 大于 b"
else
   echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
then
   echo "$a -lt $b: a 小于 b"
else
   echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
then
   echo "$a -ge $b: a 大于或等于 b"
else
   echo "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
then
   echo "$a -le $b: a 小于或等于 b"
else
   echo "$a -le $b: a 大于 b"
fi
# a o ! 与 或 非
if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a == $b: a 等于 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
   echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
   echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
   echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
   echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
   echo "$a 小于 5 或 $b 大于 100 : 返回 true"
else
   echo "$a 小于 5 或 $b 大于 100 : 返回 false"
fi

# 逻辑运算
if [[ $a -lt 100 && $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

if [[ $a -lt 100 || $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi

# 字符串相关 a="abc" b="efg"

if [ $a = $b ]
then
   echo "$a = $b : a 等于 b"
else
   echo "$a = $b: a 不等于 b"
fi
if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a != $b: a 等于 b"
fi
if [ -z $a ]
then
   echo "-z $a : 字符串长度为 0"
else
   echo "-z $a : 字符串长度不为 0"
fi
if [ -n "$a" ]
then
   echo "-n $a : 字符串长度不为 0"
else
   echo "-n $a : 字符串长度为 0"
fi
if [ $a ]
then
   echo "$a : 字符串不为空"
else
   echo "$a : 字符串为空"
fi

# 文件相关 file="/var/www/runoob/test.sh"
if [ -r $file ]
then
   echo "文件可读"
else
   echo "文件不可读"
fi
if [ -w $file ]
then
   echo "文件可写"
else
   echo "文件不可写"
fi
if [ -x $file ]
then
   echo "文件可执行"
else
   echo "文件不可执行"
fi
if [ -f $file ]
then
   echo "文件为普通文件"
else
   echo "文件为特殊文件"
fi
if [ -d $file ]
then
   echo "文件是个目录"
else
   echo "文件不是个目录"
fi
if [ -s $file ]
then
   echo "文件不为空"
else
   echo "文件为空"
fi
if [ -e $file ]
then
   echo "文件存在"
else
   echo "文件不存在"
fi

输出

1
2
3
4
5
6
echo "hello world!"

printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234 
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543 
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876 

控制

if语句 ```shell 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

1
### for

shell for loop in 1 2 3 4 5 do

1
echo "The value is: $loop"

done

for ((i=1;i<10;i++)) do

1
2
echo "$i"
sleep 1s

done

1
2
3
4
5
6
7

### while ```shell int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

util

1
2
3
4
until [ ! $a -lt 10 ]
do
   echo $a a=`expr $a + 1`
done

case

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
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

break

continue

函数

所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 函数定义
funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: $1"
    echo "输入第二个数字: $2"
    return $(($1+$2))
}

# 函数调用
funWithReturn 1 2
echo "输入的两个数字之和为 $? !"

导入

被包含的文件不需要可执行权限

1
2
3
4
5
6
7
#使用 . 号来引用test1.sh 文件
. ./test1.sh

# 或者使用以下包含文件代码
source ./test1.sh

echo "导入其他文件"