这个用来存放我有关Linux的资料。
菜鸟教程学习的一点记录:准备
这里的 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/bashecho "Hello World"复制代码
ps:echo 用于字符串的输出。接下来会讲到
变量的定义
主要就是定义字符串,数字,数组。
your_name="qinjx"echo $your_nameecho ${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 $idoneecho "-- \$@ 演示 ---"for i in "$@"; do echo $idone复制代码
执行结果:
数组
#!/bin/bash# my_array[0]=A# my_array[1]=B# my_array[2]=C# my_array[3]=Dmy_array=(A B "C" D)echo "第一个元素为: ${my_array[0]}"echo "第二个元素为: ${my_array[1]}"echo "第三个元素为: ${my_array[2]}"echo "第四个元素为: ${my_array[3]}"# get all itemecho "数组的元素为: ${my_array[*]}"echo "数组的元素为: ${my_array[@]}"# get array lengthecho "数组元素的长度为: ${#my_array[*]}"echo "数组元素的长度为: ${#my_array[@]}"复制代码
执行结果:
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" 姓名 性别 体重kgprintf "%-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 defprintf "%s\n" abc defprintf "%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=100num2=200if test $[num1] -eq $[num2]then echo '两个数相等1'else echo '两个数不相等'fi#字符串测试# = 等于则为真# != 不相等则为真# -z 字符串 字符串的长度为零则为真# -n 字符串 字符串的长度不为零则为真str1="kaka08"str2="kaka22"if test $str1 = $str2then echo "两个字符串相等"else echo "两个字符串不相等"fi#文件测试# -e 文件名 如果文件存在则为真# -r 文件名 如果文件存在且可读则为真# -w 文件名 如果文件存在且可写则为真# -x 文件名 如果文件存在且可执行则为真# -s 文件名 如果文件存在且至少有一个字符则为真# -d 文件名 如果文件存在且为目录则为真# -f 文件名 如果文件存在且为普通文件则为真# -c 文件名 如果文件存在且为字符型特殊文件则为真# -b 文件名 如果文件存在且为块特殊文件则为真cd /binif test -e ./bashthen echo '文件已存在!'else echo '文件不存在!'fi# 另外,Shell还提供了与( -a )、或( -o )、非( ! )三# 个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低。例如cd /binif test -e ./notFile -o -e ./bashthen 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# fia=10b=20if [ $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# donefor loop in 1 2 3 4 5 6do echo "The vlue is: $loop"done# while 语句# while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:# while condition# do# command# doneint=1while(($int<=5))do echo $int let "int++"done# 使用中使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量,具体可查阅:Bash let 命令# 。# while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按结束循环。# echo '按下 退出'# 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 aNumcase $aNum in 1) echo '你选择了 1' ;; 2) echo '你选择了 2' ;; 3) echo '你选择了 3' ;; 4) echo '你选择了 4' ;; *) echo '你没有输入 1 到 4 之间的数字' ;;esac复制代码
function
#!/bin/bash#sampledemoFun(){ echo "这是一个函数"}echo "---------函数开始运行----------"demoFunecho "---------函数运行完毕----------"#returnfunWithReturn(){ echo "这个函数会对输入的两个数字进行相加运算..." echo "输入第一个数字: " read aNum echo "输入第二个数字: " read anotherNum echo "两个数字分别为 $aNum 和 $anotherNum !" return $(($aNum+$anotherNum))}funWithReturnecho "输入的两个数字之和为 $? !"#传递参数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/bashurl="http://www.runoob.com"复制代码
test2.sh
#!/bin/bash#使用 . 号来引用test1.sh 文件. ./test1.sh# 或者使用以下包含文件代码# source ./test1.shecho "菜鸟教程官网地址:$url"复制代码