您的位置:首页 > 运维架构 > Shell

Shell脚本学习笔记

2017-03-19 23:48 501 查看
Shell简介:

Shell是一个命令解释器,也可以看做为一种系统软件,提供了用户与内核之间进行交互的一种通道,它解释由用户输入的命令并且把它们送到内核去执行,执行效率高。

1 #!/bin/bash
2
3 # 第一个脚本
4 # chmod +x ./test.sh   使脚本具有执行权限
5 # ./test.sh            在当前目录下执行脚本
6 # /bin/sh test.sh      指定解释器,执行脚本
7
8 #echo "hello World!"
9
10
11 #----------------------------------------------#
12 # 第二个脚本
13 # 声明变量、给变量赋值、声明变量为只读类型
14 your_name="zhoufei"
15 echo $your_name
16 echo ${your_name}
17
18 your_name="google"
19 echo ${your_name}
20
21 #readonly your_name
22 your_name="声明为只读变量"
23
24 # 字符串
25 # ''输出纯字符串,有变量也失效
26 # ""里面可以包含变量
27 your_name2='baidu'
28 str="hello I know your are \"${your_name2}\" ! \n"
29 echo ${str}
30
31 # 字符串拼接
32 your_name3="baidu3"
33 greeting="I like "${your_name3}"! ---"
34 greeting2="I like "$your_name3" ! \n"
35 echo ${greeting} ${greeting2}
36
37 # 字符串长度
38 echo "${your_name3} 长度是:${#your_name3}"
39
40 # 子字符串
41 your_name4='获取这个字符串的后三位'
42 echo ${your_name4:8:3}
43
44 # 查找子字符串
45 your_name5="runoob is a great company"
46 #echo `expr index "${your_name5}" is`
47
48 # 数组
49 echo "----------数组---------"
50 array_name=(name1 name2 name3)
51 echo "这是一个数组-${array_name[@]}"
52 array_name[3]='name4'
53 echo "这是一个数组-${array_name[@]}"
54 echo "数组的长度:${#array_name[@]}"
55 echo "数组中第0个元素的长度:${#array_name[0]}"
56
57 # Shell传递参数 $n
58 echo "----------Shell传递参数---------"
59 echo 'Shell传递参数验证如下:'
60 echo "文件名:$0"
61 echo "第一个参数:$1"
62 echo "第二个参数:$2"
63 echo "脚本执行的进程ID号:$$"
64
65 # Shell运算符
66 # expr 是一个计算工具,完成表达式的求值操作
67 val1=`expr 1 + 1`
68 echo "expr 运算符的执行结果是$val1"
69
70 # 算术运算符
71 echo "----------算术运算符---------"
72 a=10
73 b=20
74 val2=`expr $a + $b`
75 val3=`expr $a - $b`
76 val4=`expr $a \* $b`
77 val5=`expr $a / $b`
78 val6=`expr $a % $b`
79 echo "a + b : $val2"
80 echo "a - b : $val3"
81 echo "a * b : $val4"
82 echo "a / b : $val5"
83 echo "a % b : $val6"
84 if [ $a == $b ]; then
85     echo "a 等于 b"
86 fi
87 if [ $a != $b ]; then
88     echo "a 不等于 b"
89 fi
90
91 # 关系运算符
92 echo "----------关系运算符---------"
93 if [[ $a -eq $b ]]; then
94     echo "a 等于 b"
95 fi
96 if [[ $a -ne $b ]]; then
97     echo "a 不等于 b"
98 fi
99 if [[ $a -gt $b ]]; then
100     echo "a 大于 b"
101 fi
102 if [[ $a -lt $b ]]; then
103     echo "a 小于 b"
104 fi
105 if [[ $a -ge $b ]]; then
106     echo "a 大于等于 b"
107 fi
108 if [[ $a -le $b ]]; then
109     echo "a 小于等于 b"
110 fi
111
112 # 布尔运算符 !、-o、-a
113 echo "----------布尔运算符---------"
114 if [[ $a != $b ]]; then
115     echo "a 不等于 b"
116 fi
117 if [ $a -lt $b -o $a -eq $b ]; then
118     echo "a 大于等于 b"
119 fi
120 if [ $a -gt 1 -a $b -lt 10 ]; then
121     echo "a > 1 并且 b < 10"
122 else
123     echo "a > 1 并且 b < 10 是错误的!"
124 fi
125
126 # 逻辑运算符 && ||
127 echo "----------逻辑运算符---------"
128 if [[ $a -gt 1 && $a -lt 100 ]]; then
129     echo "a 大于1 并且 a 小于100 成立"
130 else
131     echo "a 大于1 并且 a 小于100 不成立"
132 fi
133 if [[ $a -le 10 || $a -gt 100 ]]; then
134     echo 'a 小于等于10 或者 a 大于 100 有一个成立'
135 else
136     echo 'a 小于等于10 或者 a 大于 100 都不成立'
137 fi
138
139 # 字符串运算符
140 echo "----------字符串运算符---------"
141 string1='string1'
142 string2='string2'
143 if [[ $string2 = $string1 ]]; then
144     echo "string1 等于 string2"
145 else
146     echo "string1 不等于 string2"
147 fi
148 if [[ $string2 != $string1 ]]; then
149     echo "string2 不等于 string1"
150 fi
151 if [[ -z $string1 ]]; then
152     echo "string1 长度是:0"
153 fi
154 if [[ -n $string1 ]]; then
155     echo "string1 长度不是:0"
156 fi
157 if [[ $string1 ]]; then
158     echo "string1 不为nil"
159 fi
160
161 # 文件测试运算符
162 echo "----------文件测试运算符---------"
163 file1='假如为:文件'
164 file2='假如为:文件夹'
165 if [[ -d $file2 ]]; then
166     echo '检测文件为文件夹'
167 fi
168 if [[ -f $file1 ]]; then
169     echo '检测文件为普通文件'
170 fi
171 if [[ -s $file1 ]]; then
172     echo '检测文件为空'
173 fi
174 if [[ -e $file1 ]]; then
175     echo '检测文件为存在的'
176 fi
177
178 # echo命令
179 echo "----------echo命令---------"
180 echo "It is a test"
181 echo "\"It is a test\""
182 echo "下面换行 \n"
183 echo -e "下面不换行 \c"  # -e 开启转义 \c 不换行
184 echo "字符串重定向到文件中" > myfile
185 echo '字符串原样输出 $a'
186 echo `date` #显示执行结果
187
188 # printf命令
189 # printf  format-string  [arguments...]
190 # %s %c %d %f都是格式替代符
191 # %-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
192 # %-4.2f 指格式化为小数,其中.2指保留2位小数。
193 # \n换行  \r回车
194 echo "----------printf命令---------"
195 echo 'Hello, Shell,能够自动换行'
196 printf "Hello, Shell,不能自动换行,需要手动加换行符 \n"
197 printf "%-10s %-8s %-4s\n" 姓名 性别 体重
198 printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.12345
199 printf "%-10s %-8s %-4.2f\n" 杨过 男 77.12345
200
201 # test命令
202 # Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
203 echo "----------test命令---------"
204 test1=100
205 test2=101
206 testString1='testString1'
207 testString2='testString2'
208 if test $test1 -lt $test2 ; then
209     printf "%s\n" test1小于test2
210 fi
211 if test -z testString1 ; then
212     printf "testString1长度为0"
213 else
214     printf "testString1长度不为0 ,:%s\n" testString1
215 fi
216 if test -e ./test1.sh ; then
217     printf "文件名:test1.sh 存在\n"
218 else
219     printf "文件名:test1.sh 不存在\n"
220 fi
221
222 # Shell流程控制
223 echo "----------Shell流程控制---------"
224 # if else-if else
225 if [[ $a == $b ]]; then
226     echo "a 等于 b"
227 elif [[ $a -gt $b ]]; then
228     echo "a 大于 b"
229 elif [[ $a -lt $b ]]; then
230     echo "a 小于 b"
231 else
232     echo "没有符合条件的"
233 fi
234 num1=$[2*3]
235 num2=$[1+5]
236 if  test $num1 -eq $num2 ; then
237     echo "num2 等于 num1"
238 else
239     echo "num1 不等于 num2"
240 fi
241 # for 循环
242 for loop in  1 2 3 4 5 6; do
243     # echo "当前输入的值是:$loop"
244     printf "当前输入的值是:%s\n" $loop
245 done
246 for string in 'This is a String!'; do
247     echo "$string"
248 done
249 # while 语句
250 # let 命令,它用于执行一个或多个表达式
251 ignore0(){
252     count=1;
253     while [[ $count -lt 10 ]]; do
254         echo "while 执行结果:$count"
255         let "count++"
256     done
257     echo '按下 <CTRL-D> 退出'
258     echo -n '输入你最喜欢的电影名: '
259     while read Film ; do
260         echo "是的! $Film 是一部好电影!"
261     done
262 }
263 #ignore0
264 ignore1(){
265     while true:
266     do
267         echo "无限循环!"
268     done
269     until false ; do
270         echo "无限循环!"
271     done
272 }
273 #ignore1
274 # case语句
275 ignore2(){
276     echo '请输入1到4之间的数字'
277     echo '你输入的数字是:'
278     read aNum
279     case $aNum in
280         1 )
281      echo "输入的数字为:$aNum"
282         ;;
283         2 )
284      echo "输入的数字为:$aNum"
285         ;;
286         3 )
287      echo "输入的数字为:$aNum"
288         ;;
289         4 )
290      echo "输入的数字为:$aNum"
291         ;;
292         * )
293      echo "你输入的数字不在1-4之间"
294         ;;
295     esac
296 }
297 #ignore2
298 # break命令
299 ignore3(){
300     while true
301     do
302         echo '输入1-5之间的数据'
303         read aNum
304         case $aNum in
305             1|2|3|4|5 )
306              echo "输入的数字为:$aNum"
307                 ;;
308             * )
309              echo "你输入的数字不在1-4之间"
310              break
311              #continue
312              echo "游戏结束"
313
314         esac
315     done
316 }
317 #ignore3
318 # Shell 函数
319 echo "----------Shell 函数---------"
320 demoFunc(){
321     echo '这是第一个函数'
322 }
323 echo '第一个函数开始'
324 demoFunc
325 echo '第一个函数结束'
326 funWithReture(){
327     echo '这个函数会对输入的参数进行加法运行...'
328     echo '输入第一个参数:'
329     read para1
330     echo '输入第二个参数:'
331     read para2
332     echo "两次输入的参数分别是:$para1---$para2"
333     return $(($para1+$para2))
334 }
335 funWithReture
336 echo "输入的数字之和为:$?"
337
338 # Shell 输入/输出重定向
339 echo "----------Shell 输入/输出重定向---------"
340 date >> myfile
341 cat myfile
342 wc -l << EOF
343 标题
344 测试 Head Document 类型
345 的追加重定向命令
346 EOF
347 ls > myfile 2>&1
348 ls > /dev/null 2>&1
349
350 # Shell 文件包含
351 echo "----------Shell 文件包含---------"
352 source ./test2.sh
353 echo "引用外部的test2.sh文件中的url变量,URL变量为:$url"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: