学习视频笔记均来自B站UP主" 泷羽sec",如涉及侵权马上删除文章
笔记的只是方便各位师傅学习知识,以下只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负
文章目录
一、脚本的创建执行以及变量使用
1.1 创建与执行
首先创建一个1.sh,
可以利用#!/bin/bash、#!/bin/dash 、#!/bin/sh三种脚本解释器,不管调用哪种最后还是调用还是这个dash
ls -l /bin/dash
ls -l /bin/bash
ls -l /bin/sh
新建一个sh文件是没有执行权限,需要加权
chmod +777 1.sh
chmod +u+x 1.sh
./1.sh
除了加权,还可以脚本解释器直接执行,脚本解释器具有一定权限
sh 1.sh
bash 1.sh
dash 1.sh
source 1.sh
1.2 变量使用
变量定义
定义一个name变量打印
name = "xiaoyu"
echo $name //变量使用在前面加dollar符
echo ${name} //完整写法应加上花括号以防变量拼接
age="27"
echo $age
echo my name is $name,and my age is $age years old
echo "my name is $name,and my age is $age years old"
echo 'my name is $name,and my age is $age years old'
变量拼接
变量拼接导致变量未定义,可以用双引号或者花括号括起来
age = 27
echo $age
echo $age years
echo $ageyears //变量拼接
echo "$age"years
echo {$age}years
查看和删除变量
set | grep name //查看变量
unset name //删除变量,unset不能删除只读变量如readonly name,此时name无法删除
变量类型
字符串变量:在 Shell中,变量通常被视为字符串,可以使用单引号 ’ 或双引号 " 来定义字符串
str = "hello world!"
str = 'hello world!'
整数变量:在一些Shell中,可以使用 declare 或 typeset 命令来声明整数变量,不声明也行
declare -i num = 42
num = 42
数组变量:Shell 也支持数组,允许在一个变量中存储多个值,数组可以是整数索引数组或关联数组
my_array=(1 2 3 4 5) //整数索引数组
declare -A associative_array //关联数组
associative_array["name"]="John"
associative_array["age"]=30
二、 基本命令
2.1 echo命令
Shell 的 echo 指令与 PHP 的 echo 指令类似,都是用于字符串的输出
echo "It is a test"
echo It is a test //两个都是打印字符串
echo "\"It is a test\"" //显示转义字符
read name
echo "$name It is a test" //显示变量
echo -e "OK! \n" //-e 开启转义显示换行\n
echo "It is a test"
echo -e "OK! \c" //-e 开启转义\c不换行
echo "It is a test"
echo '$name\"' //使用单引号原样输出
echo `date` //显示命令执行结果(反引号)
2.2 printf命令
printf 命令模仿 C 程序库(library)里的 printf() 程序。
指定格式输出
s:字符串
%d:十进制整数
%f:浮点数
%c:字符
%x:十六进制数
%o:八进制数
%b:二进制数
%e:科学计数法表示的浮点数
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
%s %c %d %f 都是格式替代符,%s 输出一个字符串,%d 整型输出,%c 输出一个字符,%f 输出实数,
以小数形式输出。
%-10s 指一个宽度为 10 个字符(- 表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽
的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中 .2 指保留 2 位小数。
2.3 test命令
用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
数值测试
参数 | 说明 |
---|---|
-eq | 等于则为真 |
-ne | 不等于则为真 |
-gt | 大于则为真 |
-ge | 大于等于则为真 |
-lt | 小于则为真 |
-le | 小于等于则为真 |
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
字符串测试
参数 | 说明 |
---|---|
= | 等于则为真 |
!= | 不相等则为真 |
-z 字符串 | 字符串的长度为零则为真 |
-n 字符串 | 字符串的长度不为零则为真 |
num1="ru1noob"
num2="runoob"
if test $num1 = $num2
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
三、 永久环境变量
3.1 常见变量
echo $HOME //根目录
which -a ls //查看ls脚本路径
echo $PATH //环境变量 PATH 变量包含了操作系统搜索可执行文件的路径
3.2 特殊变量
$0 :脚本名称
$1, $2,$3 .... 等表示脚本参数
$#:传递给脚本的参数数量
$?:表示上一个命令的退出状态
3.3 设立临时变量
将/root目录直接添加到环境变量,整个/root目录的文件都可以执行
export PATH=/root:PATH
echo $PATH
将目录添加到当前会话的环境变量的开头。这意味着,当你在命令行中输入一个命令时,系统会首先在目录下查找该命令,以上更改只会影响当前会话,不是永久变量
3.4 设立永久变量
- 将脚本放入环境变量的路径。比如直接写到/usr/bin 系统级可执行文件的默认位置
- 写入配置文件
打开文件,并添加环境变量设置
vi .bashrc
文件末尾写入 export PATH=/root::PATH
source (变量生效,或者重启生效)
对于所有用户,可以在全局配置文件中设置环境变量
/etc/environment:
vi /etc/environment
写入 PATH="/root:$PATH"
/etc/profile:
在这里添加环境变量设置,会影响到所有用户
vi /etc/profile
export PATH=/usr/local/bin:$PATH //添加 /usr/local/bin 到 PATH 环境变量
source /etc/profile
echo $PATH
/etc/profile.d/*.sh:
可以在目录下创建一个或多个以结尾的脚本文件,并在其中设置环境变量。这些脚本将在被执行时被调用。
touch /etc/profile.d/myenv.sh
vi /etc/profile.d/myenv.sh
export PATH=/root:$PATH //写入
chmod +x /etc/profile.d/myenv.sh
source /etc/profile.d/myenv.sh
echo $PATH
四、 字符串显位
4.1. Shell 字符串
字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。
单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字符串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用
双引号字符串的优点:
双引号里可以有变量
双引号里可以出现转义字符
your_name="runoob"
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str
输出:Hello, I know you are "runoob"!
4.2 字符串显位
str = "hello world"
echo ${#str} //输出字符串长度
echo ${str:0:6} //打印前五个字符
string="runoob is a great site"
echo `expr index "$string" io` # 输出 4 //查找子字符i或o,谁先出现计算谁 注意是反引号`
五、脚本参数传递与数学运算
5.1 脚本参数传递
echo 执行的文件名是:$0
echo 第一个参数是:$1
echo 第二个参数为:$2
echo 第三个参数为:$3
echo 传递的参数作为一个字符串显示:$*
echo 传递的参数独立作为每一个字符串显示:$@
echo 传递到脚本参数个数是:$#
echo 最后命令退出状态:$?
echo 脚本运行的当前进程的ID是:$$
$*与$@不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,
则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
sh 9.sh name //指定参数name
echo "-- \$* 演示 ---"
for i in "$*"; do
echo $i
done
echo "-- \$@ 演示 ---"
for i in "$@"; do
echo $i
done
5.2 数学运算
使用expr进行运算
expr 5+10 //直接输出5+10
expr 5 + 10 //计算5 + 10
expr 10 - 5 //计算10 - 5
expr 10 \* 5 //乘法需要反斜杠转义
expr 10 / 5 //取整
expr 10 % 5 //取余
expr \(5 + 10\)\*7 //括号也需要转义
name = `expr \(5 + 10\)\*7` //这里使用的是反引号,完整的表达式要被 ` ` 包含
echo $name
# 初始化变量
num=5
# 自增
num=$(expr $num + 1)
# 自减
num=$(expr $num - 1)
echo $num
使用$(( ))运算
# 初始化变量
num=5
# 自增
num=$((num + 1))
# 自减
num=$((num - 1))
echo $num
使用 (( )) 进行运算
# 初始化变量
num=5
# 自增
((num++))
# 自减
((num--))
echo $num
# 初始化变量
num=5
echo "初始值: $num"
# 自增
let num++
echo "自增后: $num"
# 自减
let num--
echo "自减后: $num"
# 使用 $(( ))
num=$((num + 1))
echo "使用 $(( )) 自增后: $num"
num=$((num - 1))
echo "使用 $(( )) 自减后: $num"
# 使用 expr
num=$(expr $num + 1)
echo "使用 expr 自增后: $num"
num=$(expr $num - 1)
echo "使用 expr 自减后: $num"
# 使用 (( ))
((num++))
echo "使用 (( )) 自增后: $num"
((num--))
echo "使用 (( )) 自减后: $num"
六、运算符
6.1 算术运算符
下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20;
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | expr $a + $b 结果为 30。 |
- | 减法 | expr $a - $b 结果为 -10。 |
* | 乘法 | expr $a \* $b 结果为 200。 |
/ | 除法 | expr $b / $a 结果为 2。 |
% | 取余 | expr $b % $a 结果为 0。 |
= | 赋值 | a=$b 把变量 b 的值赋给 a。 |
== | 相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ] 返回 false。 |
!= | 不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] 返回 true。 |
注意:条件表达式要放在方括号之间,并且要有空格,例如: [ a = = a== a==b] 是错误的,必须写成 [ $a == $b ]
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 == $b ]
then
echo "a 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于 b"
fi
6.2 关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-ne | 检测两个数是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |
a=10
b=20
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
6.4 布尔运算符
下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
! | 非运算,表达式为 true 则返回 false,否则返回 true。 | [ ! false ] 返回 true。 |
-o | 或运算,有一个表达式为 true 则返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
-a | 与运算,两个表达式都为 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
a=10
b=20
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
6.5 逻辑运算符
以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
&& | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
a=10
b=20
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
num1=9
num2=19
if[$num1!=9]; then
echo num1不等于9
else
echo num1等于9
余运算
num1=9
num2=19
if ["$num1" != "9" -a "$num2" -lt "20"]; then //-a连接两个条件相当于&
echo true
else
echo false
fi
if ["$num1" != "9" -o "$num2" -lt "20"]; then //-o连接两个条件相当于|
echo true
else
echo false
fi
6.6 字符串运算符
下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
!= | 检测两个字符串是否不相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
-z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
-n | 检测字符串长度是否不为 0,不为 0 返回 true。 | [ -n “$a” ] 返回 true。 |
$ | 检测字符串是否不为空,不为空返回 true。 | [ $a ] 返回 true。 |
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
str1 = "hello"
str2 = "hello"
if ["$str1" = "$str2"]; then
echo true
else
echo false
fi
// -z 检查字符串长度是否为0
if [-z "$str1"]; then
echo true
else
echo false
fi
//-n 检查字符串长度是否不为0
if [-n "$str1"]; then
echo true
else
echo false
fi
6.7.文件测试运算符
文件测试运算符用于检测 Unix 文件的各种属性。
属性检测描述如下:
操作符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] 返回 false。 |
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] 返回 false。 |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] 返回 false。 |
-p file | 检测文件是否是有名管道,如果是,则返回 true。 | [ -p $file ] 返回 false。 |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 | [ -u $file ] 返回 false。 |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
其他检查符:
- -S: 判断某文件是否 socket。
- -L: 检测文件是否存在并且是一个符号链接。
变量 file 表示文件 /var/www/runoob/test.sh,它的大小为 100 字节,具有 rwx 权限
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
七、脚本与用户交互
7.1 脚本交互
read name age
xiaoyu 26
echo $name
echo $age
bash //进入bash环境
read -p "请输入你的姓名:" name
read -p "请输入你的姓名:" name -t 10 //-t 指定时间自动退出
read -n 3 -t 10 -p "请输入你的姓名:" name // -n 指定输入长度
模拟脚本
read -p "请输入你的姓名:" name
echo "你输入的姓名为$name"
八、流程控制
if else 语句
if else 的 […] 判断语句中大于使用 -gt,小于使用 -lt。
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
如果使用 ((…)) 作为判断语句,大于和小于可以直接使用 > 和 <
a=10
b=20
if (( $a == $b ))
then
echo "a 等于 b"
elif (( $a > $b ))
then
echo "a 大于 b"
elif (( $a < $b ))
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
if else 语句经常与 test 命令结合使用,如下所示
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
echo '两个数字相等!'
else
echo '两个数字不相等!'
fi
if语句写成一行
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
case 语句
匹配数字
read -p "请你输入一个数值:" num
case $num in
1)echo 你输入的数字是1
;;
2)echo 你输入的数字是2
;;
3)echo 你输入的数字是3
;;
*)echo 你输入的是其他数字
;;
esac
匹配字符串
read -p "请你输入字符串:" site
case "$site" in
"bing") echo "Bing 搜索"
;;
"google") echo "Google 搜索"
;;
"baidu") echo "百度搜索"
;;
esac
九、循环控制
for循环
顺序输出数字
for num in 1 2 3 4 5
do //表示for循环执行的操作
echo "The number is $num"
done //for循环结束关键字
for i in 'seq 1 100' //seq从1到100
do
echo $i
done
for i in $(seq 1 100)
do
echo $i
done
for ((i=1;i<100;i++))
do
echo $i
done
顺序输出字符串的字符
for str in "hello world"
do
echo $str
done
while循环
i=1
while(($i<100))
do
echo $i
((i++))
done
i=1
while(($i<=10))
do
echo $i
let "i++"
done
until循环
i=0
until [! $i -lt 10]
do
echo $i
((i++))
done
break
break跳出所有循环(终止执行后面的所有循环)
while :
do
echo -n "输入 1 到 5 之间的数字:"
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
break
;;
esac
done
continue
continue 不会跳出所有循环,仅仅跳出当前循环
while :
do
echo -n "输入 1 到 5 之间的数字: "
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的!"
continue
echo "游戏结束"
;;
esac
done
十、函数创建调用
10.1 函数基本创建及调用
DemoFunc(){
echo "hello world"
}
DemoFunc
10.2 带return函数
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
//函数返回值在调用该函数后通过 $? 来获得
10.3 函数参数
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数
DemoFunc(){
echo "hello world"
echo "My name is $1"
}
DemoFunc xiaoyu
DemoFunc(){
echo "hello world"
echo "My name is $1,and my age is $2 years old"
}
DemoFunc xiaoyu 27
注意, 10 不能获取第十个参数,获取第十个参数需要 10 不能获取第十个参数,获取第十个参数需要 10不能获取第十个参数,获取第十个参数需要{10}。当n>=10时,需要使用${n}来获取参数。
另外,还有几个特殊字符用来处理参数:
参数处理 | 说明 |
---|---|
$# | 传递到脚本或函数的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
十一、脚本包含
假设存在2.sh,新建3.sh写入2.sh
然后bash 3.sh 可以调用执行2.sh
name = "xiaoyu"
age = 23
source 2.sh //或者../2.sh 使用.来引用2.sh文件
echo "My name is $name,and I am$age years old"
bash 3.sh
十二、重定向
重定向命令列表如下:
命令 | 说明 |
---|---|
command > file | 将输出重定向到 file。 |
command < file | 将输入重定向到 file。 |
command >> file | 将输出以追加的方式重定向到 file。 |
n > file | 将文件描述符为 n 的文件重定向到 file。 |
n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file。 |
n >& m | 将输出文件 m 和 n 合并。 |
n <& m | 将输入文件 m 和 n 合并。 |
<< tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 |
12.1 输出重定向
ls > 1.txt //将ls执行返回的内容输入重定向1.txt
who > 1.txt //将who执行返回的内容输入重定向1.txt
可以看出 > 会覆盖1.txt内容,可以使用>>追加
ls > /dev/nul //将ls重定向至回收站 执行但无回显
12.2 输入重定向
ls -l < dirs.txt //从dirs.txt读取内容
command1 < infile > outfile
同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中。
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
command > /dev/null
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
12.3 文件描述符
0:标准输入
1:标准输出
2:错误输出
ls > 3.txt 2 > 5.txt
如果ls输出正确会输出到3.txt
coo > 3.txt 2 > 5.txt
如果coo输出错误会输出到5.txt,输出详细错误信息