shell 脚本基础笔记
2017-01-01 本文已影响205人
黑泥卡
这个trello用来存放我有关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/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
执行结果:
数组
#!/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[@]}"
执行结果:
数组
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"