Quantcast
Channel: CodeSection,代码区,Linux操作系统:Ubuntu_Centos_Debian - CodeSec
Viewing all articles
Browse latest Browse all 11063

“Shell教程”

$
0
0

这里的 shel l脚本指的 bash 脚本。

如果你新建的是 test.sh,如果想运行这个 sh。你需要执行 ./test.sh而不是 test.sh。

运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去PATH里寻找有没有叫test.sh的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找

Shebang 用来指定,使用那个终端。

#!/bin/bash

接下来就可以编写你的bash脚本了。

编写你的shell

惯例HelloWorld

#!bin/bash echo "Hello World"

ps:echo 用于字符串的输出。接下来会讲到

变量的定义

主要就是定义字符串,数字,数组。

详细定义规则 your_name="qinjx" echo $your_name echo ${your_name} 传递参数 #!/bin/bash # 传递参数实例 echo "Shell 传递参数实例!"; echo "执行的文件名:$0"; echo "第一个参数为:$1"; echo "第二个参数为:$2"; echo "第三个参数为:$3"; # 用于处里字符的参数 # # 参数处理 说明 # $# 传递到脚本的参数个数 # $* 以一个单字符串显示所有向脚本传递的参数。 # 如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 # $$ 脚本运行的当前进程ID号 # $! 后台运行的最后一个进程的ID号 # $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。 # 如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 # $- 显示Shell使用的当前选项,与set命令功能相同。 # $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 # # echo "参数个数为:$#"; echo "传递的参数作为一个字符串显示:$*"; # $* 与 $@ 区别: # 相同点:都是引用所有参数。 # 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。 echo "-- \$* 演示 ---" for i in "$*"; do echo $i done echo "-- \$@ 演示 ---" for i in "$@"; do echo $i done

执行结果:


“Shell教程”
数组 #!/bin/bash # my_array[0]=A # my_array[1]=B # my_array[2]=C # my_array[3]=D my_array=(A B "C" D) echo "第一个元素为:${my_array[0]}" echo "第二个元素为:${my_array[1]}" echo "第三个元素为:${my_array[2]}" echo "第四个元素为:${my_array[3]}" # get all item echo "数组的元素为:${my_array[*]}" echo "数组的元素为:${my_array[@]}" # get array length echo "数组元素的长度为:${#my_array[*]}" echo "数组元素的长度为:${#my_array[@]}"

执行结果:


“Shell教程”
printf #!/bin/bash # printf 命令模仿 C 程序库(library)里的 printf() 程序。 # 标准所定义,因此使用printf的脚本比使用echo移植性好。 # printf 使用引用文本或空格分隔的参数,外面可以在printf中使用格式化字符串,还可以制定字符串的宽度、 # 左右对齐方式等。默认printf不会像 echo 自动添加换行符,我们可以手动添加 \n。 # %s %c %d %f都是格式替代符 # %-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。 # %-4.2f 指格式化为小数,其中.2指保留2位小数。 printf "%-10s % -8s %-4s\n" 姓名 性别 体重kg printf "%-10s % -8s %-4.2f\n" 郭靖 男 66.7865 # format-string为双引号 printf "%d %s\n" 1 "abc" # 单引号与双引号效果一样 printf '%d %s\n' 1 "abc" # 没有引号也可以输出 printf %s abcdef # 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用 printf %s abc def printf "%s\n" abc def printf "%s %s %s\n" a b c d e f g h i j # 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替 printf "%s and %d \n" test #!/bin/bash #数值测试 # -eq 等于则为真 # -ne 不等于则为真 # -gt 大于则为真 # -ge 大于等于则为真 # -lt 小于则为真 # -le 小于等于则为真 num1=100 num2=200 if test $[num1] -eq $[num2] then echo '两个数相等1' else echo '两个数不相等' fi #字符串测试 # = 等于则为真 # != 不相等则为真 # -z 字符串 字符串的长度为零则为真 # -n 字符串 字符串的长度不为零则为真 str1="kaka08" str2="kaka22" if test $str1 = $str2 then echo "两个字符串相等" else echo "两个字符串不相等" fi #文件测试 # -e 文件名 如果文件存在则为真 # -r 文件名 如果文件存在且可读则为真 # -w 文件名 如果文件存在且可写则为真 # -x 文件名 如果文件存在且可执行则为真 # -s 文件名 如果文件存在且至少有一个字符则为真 # -d 文件名 如果文件存在且为目录则为真 # -f 文件名 如果文件存在且为普通文件则为真 # -c 文件名 如果文件存在且为字符型特殊文件则为真 # -b 文件名 如果文件存在且为块特殊文件则为真 cd /bin if test -e ./bash then echo '文件已存在!' else echo '文件不存在!' fi # 另外,Shell还提供了与( -a )、或( -o )、非( ! )三 # 个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低。例如 cd /bin if test -e ./notFile -o -e ./bash then echo '有一个文件存在!' else echo '两个文件都不存在' fi 流程控制 #!/bin/bash # if condition # then # command1 # command2 # ... # commandN # fi # 写成一行(适用于终端命令提示符): # if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi # if condition1 # then # command1 # elif condition2 # then # command2 # else # commandN # fi 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 # for 循环 # 与其他编程语言类似,Shell支持for循环。 # for循环一般格式为: # for var in item1 item2 ... itemN # do # command1 # command2 # ... # commandN # done for loop in 1 2 3 4 5 6 do echo "The vlue is:$loop" done # while 语句 # while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为: # while condition # do # command # done int=1 while(($int<=5)) do echo $int let "int++" done # 使用中使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量,具体可查阅:Bash let 命令 # 。 # while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按<Ctrl-D>结束循环。 # echo '按下 <CTRL-D> 退出' # echo -n '输入你最喜欢的电影名: ' # while read FILM # do # echo "是的!$FILM 是一部好电影" # done # Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下: # case 值 in # 模式1) # command1 # command2 # ... # commandN # ;; # 模式2) # command1 # command2 # ... # commandN # ;; # esac # case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。 # 取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。 # 下面的脚本提示输入1到4,与每一种模式进行匹配: 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 function #!/bin/bash #sample demoFun(){ echo "这是一个函数" } echo "---------函数开始运行----------" demoFun echo "---------函数运行完毕----------" #return funWithReturn(){ echo "这个函数会对输入的两个数字进行相加运算..." echo "输入第一个数字: " read aNum echo "输入第二个数字: " read anotherNum echo "两个数字分别为$aNum和$anotherNum!" return $(($aNum+$anotherNum)) } funWithReturn echo "输入的两个数字之和为 $? !" #传递参数 funWithParam(){ echo "第一个参数为$1!" echo "第二个参数为$2!" echo "第十个参数为$10!" echo "第十个参数为${10}!" echo "第十一个参数为${11}!" echo "参数总数有$#个!" echo "作为一个字符串输出所有参数 $* !" } funWithParam 1 2 3 4 5 6 7 8 9 34 73 # 注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。 输入/输出重定向

地址: http://www.runoob.com/linux/linux-shell-process-control.html

文件包含

格式:

. filename # 注意点号(.)和文件名中间有一空格 或 source filename

实例:

test1.sh

#!/bin/bash url="http://www.runoob.com"

test2.sh

#!/bin/bash #使用 . 号来引用test1.sh 文件 . ./test1.sh # 或者使用以下包含文件代码 # source ./test1.sh echo "菜鸟教程官网地址:$url"


Viewing all articles
Browse latest Browse all 11063

Trending Articles