学习菜鸟教程笔记
shell在线工具
Shell脚本入门级操作指南https://www.bilibili.com/read/cv14927748
shell的基本概述与变量的定义https://www.cnblogs.com/chenyun1/p/12879230.html
🐖 Shell 既是一种脚本编程语言,也是一个连接内核和用户的软件。
Shell 环境
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
🐖在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh
,它同样也可以改为 #!/bin/bash
。
🐖 #!
指定系统中解释此脚本文件的 Shell 程序(解释器)。
通常写一个shell脚本都要在第一行注明使用什么解释器来解释这个脚本,即写成:#!/bin/bash
这样的形式,意思是告诉系统要使用/bin/bash这个解释器来解释下面的语句。
sh,bash,csh,ksh的区别
- Bourne Shell(即
sh
)是UNIX最初使用的shell,并且在每种UNIX上都可以使用。 - LinuxOS默认的是Bourne Again Shell,它是Bourne Shell的扩展,简称
bash
,与Bourne Shell完全兼容,并且在Bourne Shell的基础上增加,增强了很多特性。可以提供命令补全,命令编辑和命令历史等功能。 - C Shell(
csh
)是一种比Bourne Shell更适合的变种Shell,它的语法与C语言很相似。Linux为喜欢使用C Shell的人提供了Tcsh。 Tcsh是C Shell的一个扩展版本。 - Korn Shell(
ksh
)集合了C Shell和Bourne Shell的优点并且和Bourne Shell完全兼容。Linux系统提供了pdksh(ksh的扩展),它支持人物控制,可以在命令行上挂起,后台执行,唤醒或终止程序。
几种常见的Shell:sh、bash、csh、tcsh、ash http://c.biancheng.net/cpp/view/6995.html
查看所有Shell
Shell 是一个程序,一般都是放在/bin或者/usr/bin目录下,当前 Linux 系统可用的 Shell 都记录在/etc/shells文件中。/etc/shells是一个纯文本文件,你可以在图形界面下打开它,也可以使用 cat /etc/shells
命令查看它。
查看当前 Linux 的默认 Shell
可以输出 SHELL 环境变量:$ echo $SHELL
set和setenv
set和setenv https://www.cnblogs.com/yuandonghua/p/10535411.html
- set(属于csh系列)主要是用来设置shell变量,这里的变量是普通变量,就像C语言里一样,使用一个变量以前要申明一下。
🐖 set 是对当前进程有效,不会传递给子进程
🐖 语法格式
set 变量名 = 内容
set 变量名 =(内容1 内容2 )
set 变量名 ="内容1 内容2"
🐖 set赋值是赋值一个对象,这个变量所包含的是对象返回来的值;而不用set
,赋值的是字符串或数字。
🐖在Bash中,变量的默认类型都是字符型。
x=123
y=456
echo $x+$y
#输出结果是 123+456
# 可以用作字符串拼接
- 初始化位置参数
调用 set 是接一个或多个参数时,set 会把参数的值赋予位置参数,从 $1 开始赋值。如下例子:
$ cat set-it.sh
#!/bin/bash
set first second third
echo $3 $2 $1
$ ./set-it.sh
third second first
setenv
(属于csh系列)中的env就是环境environment的简写,这个命令是用来设置环境变量的,譬如说设置文件路径、本地显示。
🐖 setenv 不仅对当前shell进程有效,也会传递给子进程。
🐖 如果环境变量不写入配置文件,那么当前 Shell 一旦终止,这个环境变量就会消失,而只有写入配置文件才会永久地在所有 Shell 中生效。
🐖 语法格式
setenv 变量名 内容
setenv 变量名 "内容1 内容2"
setenv 变量名 '内容1 内容2'
- setenv 相当于bash中的export
🐖 语法格式
export 变量名=变量值
(将shell变量输出为环境变量或全局变量)
export PATH=$PATH:/opt/au1200_rm/build_tools/bin
-
使用unset命令来清除环境变量,注意set setenv export设置的变量,都可以用unset来清除的
格式:unset 变量名
(注意:声明静态变量readonly变量不可用unset撤销) -
查看变量,
set
显示所有变量,包括自定义变量和环境变量
set | grep var #查看自定义变量
echo $PATH #查看环境变量
- alias作用相当windows下的快捷方式。
🐖 语法格式
alias 简化名称 原文件名
alias 简化名称 "原文件名 参数"
运行 Shell 脚本有两种方法:
1、作为可执行程序
将上面的代码保存为 test.sh
,并 cd 到相应目录:
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
🐖这种方式运行的脚本,需要在第一行指定解释器信息,也需要添加可执行权限。
🐖注意,一定要写成 ./test.sh
,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有/bin, /sbin, /usr/bin,/usr/sbin
等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh
告诉系统说,就在当前目录找。
2、作为解释器参数
直接运行解释器,其参数就是 shell 脚本的文件名,如:
/bin/sh test.sh
或
sh test.sh
🐖这种方式运行的脚本,不需要在第一行指定解释器信息,也不需要添加可执行权限。
Shell 变量
(1)定义变量时,变量名不加美元符号($),如:
your_name="runoob.com"
🐖注意,变量名和等号之间不能有空格
🐖 变量名的命名须遵循如下规则:
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
(2)用for语句给变量赋值,如:
for file in `ls /etc`; do
echo $file
done
或
for file in $(ls /etc); do
echo $file
done
以上语句将 /etc 下目录的文件名循环出来。
echo
命令用于向窗口输出文本。一般情况下,双引号可省。
(3)已定义的变量,可以被重新定义,如
your_name="tom"
your_name="alibaba"
echo $your_name
使用变量
使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
your_name="qinjx"
echo $your_name
echo ${your_name}
🐖 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。
🐖推荐给所有变量加上花括号,这是个好的编程习惯。
只读变量
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
#!/bin/bash
myUrl="https://www.google.com"
readonly myUrl
删除变量
使用 unset 命令可以删除变量。语法:
unset variable_name
🐖 变量被删除后不能再次使用。unset 命令不能删除只读变量。
变量类型
shell 变量的作用域可以分为三种:
1) 局部变量
有的变量只能在函数内部使用,这叫做局部变量(local variable);
2) 全局变量
有的变量可以在当前 Shell 进程中使用,这叫做全局变量(global variable);
3) 环境变量
有的变量可以在子进程中使用,这叫做环境变量(environment variable)
🐖 在函数内部定义的变量,默认也是全局变量,只有加上local关键字,才会变成局部变量。
Shell 字符串
字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。
单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符
拼接字符串
your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3
输出结果为:
hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !
获取字符串长度
string="abcd"
echo ${#string} #输出 4
提取子字符串
以下实例从字符串第 2 个字符开始截取 4 个字符:
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
🐖 注意:第一个字符的索引值为 0。
查找子字符串
查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):
string="runoob is a great site"
echo `expr index "$string" io` # 输出 4
🐖 注意: 以上脚本中 ` 是反引号,而不是单引号 ',不要看错了哦。
🐖 注意:位置从1开始数
Shell 数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。
定义数组
在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
数组名=(值1 值2 ... 值n)
或者
数组名=(
值1
值2
...
值n)
还可以单独定义数组的各个分量(用下标):
array_name[0]=value0
array_name[1]=value1
array_name[4]=valuen
🐖 可以不使用连续的下标,而且下标的范围没有限制。
🐖 echo ${array_name[3]}
输出为空
读取数组
读取数组元素值的一般格式是:
echo ${数组名[下标]}
使用 @ 符号或者*号可以获取数组中的所有元素,例如:
echo ${array_name[@]}
echo ${array_name[*]}
获取数组的长度
获取数组长度的方法与获取字符串长度的方法相同,例如:
取得数组元素的个数
length=${#array_name[@]}
或者
length=${#array_name[*]}
取得数组单个元素的长度
lengthn=${#array_name[n]}
Shell 注释
(1)单行注释:
以 # 开头的行就是注释,会被解释器忽略。
(2)多行注释:使用以下格式:
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
EOF 也可以换成其他符号,如'
!
等
:<<!
注释内容...
注释内容...
注释内容...
!
Shell 传递参数
我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n
。n 代表一个数字。
$0 为执行的文件名(包含文件路径);
$1 为执行脚本的第一个参数;
$2 为执行脚本的第二个参数,以此类推……
10以上的参数需要用大括号括起,如${10}
为脚本设置可执行权限,并执行脚本,在脚本后面加上参数,输出结果如下所示:
$ chmod +x test.sh
$ ./test.sh para1 para2 para3
🐖 在为shell脚本传递的参数中如果包含空格,应该使用单引号或者双引号将该参数括起来,以便于脚本将这个参数作为整体来接收。
🐖 在有参数时,可以使用对参数进行校验的方式处理以减少错误发生:
if [ -n "$1" ]; then
echo "包含第一个参数"
else
echo "没有包含第一参数"
fi
🐖 注意:中括号 [] 与其中间的代码应该有空格隔开
if [ -f FILE ]
如果 FILE 存在且是一个普通文件则为真。
另外,还有几个特殊字符用来处理参数:
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数。如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。如"$@“用「”」括起来的情况、以"$1" “$2” … “$n” 的形式输出所有参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
$* 与 $@ 区别:
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。
🐖 $*
(*
代表命令行中的所有参数,$*
把所有参数看成一个整体)
Shell 里面的中括号(包括单中括号与双中括号)可用于一些条件的测试:
- 算术比较, 比如一个变量是否为0,
[ $var -eq 0 ]
。 - 文件属性测试,比如一个文件是否存在,
[ -e $var ]
; 是否是目录,[ -d $var ]
。 - 字符串比较, 比如两个字符串是否相同,
[[ $var1 = $var2 ]]
。
Shell 基本运算符
Shell 和其他编程语言一样,支持多种运算符,包括:
- 算数运算符
- 关系运算符
- 布尔运算符
- 字符串运算符
- 文件测试运算符
算数运算符
原生bash不支持简单的数学运算(+ - * / % == !=),但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。例如,
val=`expr 2 + 2`
🐖 注意:
两个数相加(注意使用的是一对反引号 ` 而不是单引号 '):
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
假定变量 a 为 10,变量 b 为 20:
val=`expr $a \* $b`
echo "a * b : $val"
🐖 乘号()前边必须加反斜杠()才能实现乘法运算;
🐖 在 MAC 中 shell 的 expr 语法等价于:$((表达式)),此处表达式中的 "" 不需要转义符号 “” 。
val=$(($a * $b))
echo "a * b : $val"
if…then…fi 是条件语句;==用于比较两个数字,相同则返回 true。
if [ $a == $b ]
then
echo "a 等于 b"
关系运算符(数值运算)
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
-eq (等于); -ne(不等);-gt(大于);-lt(小于);-ge(大于等于);-le(小于等于)
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b : a 不等于 b"
布尔运算符
!(非);-o(或);-a(与)
if [ $a -lt 100 -a $b -gt 15 ]
then
echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
逻辑运算符
&&(逻辑的 AND) ;||(逻辑的 OR)
if [[ $a -lt 100 && $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
字符串运算符
下表列出了常用的字符串运算符,假定变量 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。 |
文件测试运算符
文件测试运算符用于检测 Unix 文件的各种属性。
属性检测描述如下:
操作符 | 说明 | 举例 |
---|---|---|
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
其他检查符: | ||
-b :块设备文件 | ||
-c :字符设备文件 | ||
-d :目录 | ||
-p :管道 | ||
-r :可读 | ||
-w:可写 | ||
-S: 判断某文件是否 socket。 | ||
-L: 检测文件是否存在并且是一个符号链接。 |
echo命令
echo
命令用于向窗口输出文本。一般情况下,双引号可省。
- 显示普通转义字符
echo "\"It is a test\""
结果将是:"It is a test"
- 显示特殊转义字符
echo -e "OK! \n" # -e 开启转义 \n 换行
echo -e "OK! \c" # -e 开启转义 \c 不换行
- 显示变量
read
命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量(类似于C中的scanf
)
#!/bin/sh
read name
echo "$name It is a test"
以上代码保存为 test.sh,name 接收标准输入的变量,结果将是:
[root@www ~]# sh test.sh
OK #标准输入
OK It is a test #输出
Linux read 命令https://www.runoob.com/linux/linux-comm-read.html
- 显示结果定向至文件
echo "It is a test" > myfile
- 原样输出字符串,不进行转义或取变量(用单引号)
echo '$name\"'
输出结果:$name\"
- 显示命令执行结果
echo `date`
结果将显示当前日期:Mon 19 Jul 2021 10:34:25 AM UTC
🐖 注意: 这里使用的是反引号 `, 而不是单引号 '。
Shell printf 命令
printf
由 POSIX 标准所定义,因此使用 printf
的脚本比使用 echo
移植性好。(类似于C中的printf
)
🐖 默认 printf
不会像 echo
(一个echo
一行)自动添加换行符,我们可以手动添加 \n
。
printf `命令的语法:
printf format-string [arguments...]
参数说明:
format-string
: 为格式控制字符串;arguments
: 为参数列表。
#!/bin/bash
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
%s %c %d %f
都是格式替代符,%s
输出一个字符串,%d
整型输出,%c
输出一个字符,%f
输出实数,以小数形式输出。%-10s
指一个宽度为 10 个字符(-
表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。%-4.2f
指格式化为小数,其中.2
指保留2位小数。
Shell test 命令
Shell中的 test
命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
输出结果:两个数相等!
Shell 中的中括号用法
Shell 中的中括号用法总结
Shell 里面的中括号(包括单中括号与双中括号)可用于一些条件的测试:
- 算术比较, 比如一个变量是否为0,
[ $var -eq 0 ]
- 文件属性测试,比如一个文件是否存在,
[ -e $var ]
; 是否是目录,[ -d $var ]
。 - 字符串比较, 比如两个字符串是否相同,
[[ $var1 = $var2 ]]
。
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b : a 不等于 b"
test 命令与中括号用法的比较
- 数值
if test $[num1] -eq $[num2]
if [ $a -eq $b ]
- 字符串
if test $str1 = $str2
if [ $a = $b ]
- 文件
if test -e ./bash
if [ -e $file ]
- 逻辑
Shell 还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为: ! 最高, -a 次之, -o 最低。
if test -e ./notFile -a -e ./bash
if [ $a -lt 100 -a $b -gt 15 ]
括号总结
🐖 [ 和 test 是 Shell 的内部命令,而[[是Shell的关键字。
🐖 在[[中使用&&和||表示逻辑与和逻辑或。[ 中使用 -a 和 -o 表示逻辑与和逻辑或。
Shell 流程控制
sh/bash
的流程控制不可为空。如果else
分支没有语句执行,就不要写这个else
。- 所有代码写成一行(适用于终端命令提示符)
- if分支语句(
if then elif then else fi
) - for循环
for str in This is a string
do
echo $str
done
🐖 通常情况下 shell 变量调用需要加 $,但是 for 的 (()) 中不需要;
🐖 如果要在循环体中进行 for 中的 next 操作,记得变量要加 $
,不然程序会变成死循环。
下面来看一个例子:
#!/bin/bash
for((i=1;i<=5;i++));do
echo "这是第 $i 次调用";
done;
-
while 循环用于不断执行一系列命令,也用于从输入文件中读取数据。
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let int++ # let "int++"
done
以上实例使用了 Bash let
命令,它用于执行一个或多个表达式,变量计算中不需要加上 $
来表示变量,如果表达式中包含了空格或其他特殊字符,则必须引起来。具体可查阅:Bash let命令
- while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量
FILM
,按<Ctrl-D>
结束循环。
echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
do
echo "是的!$FILM 是一个好网站"
done
- 无限循环
while : # while true
do
command
done
或者
for (( ; ; ))
- until 循环
until 循环执行一系列命令直至条件为 true 时停止。
until condition
do
command
done
- case … esac
case ... esac
为多选择语句(类似于switch ... case
语句)
🐖 每个case
分支用右圆括号开始,用两个分号;;
表示break
,即执行结束,跳出整个case ... esac
语句。
🐖esac
(就是case
反过来)作为结束标记。
🐖case
语句的取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号*
捕获该值,再执行后面的命令。
case ... esac
语法格式实例:
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
Shell 函数
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。
shell中函数的定义格式实例:
demoFun(){
echo "这是我的第一个 shell 函数!"
echo "第一个参数为 $1 !"
echo "第十个参数为 ${10} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
echo "-----函数开始执行-----"
demoFun 1 10
echo "-----函数执行完毕-----"
运行结果:
-----函数开始执行-----
这是我的第一个 shell 函数!
第一个参数为 1 !
第十个参数为 10 !
参数总数有 2 个!
作为一个字符串输出所有参数 1 10 !
-----函数执行完毕-----
- 1、可以带
function fun()
定义,也可以直接fun()
定义,不带任何参数。 - 2、参数返回,可以显示加:
return
返回,如果不加,将以最后一条命令运行结果,作为返回值。 - 3、所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。
- 4、在Shell中,调用函数时可以向其传递参数。在函数体内部,通过
$n
的形式来获取参数的值,当n>=10时,需要使用${n}
来获取参数。
Shell 输入/输出重定向
- 文件描述符
0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。 - 重定向命令列表如下:
简记:>
输出覆盖;>>
输出追加;<
输入覆盖;&
结合;<<tag
从标准输入中读入,直到遇见分界符tag才停止。
Here Document
Here Document 是 Shell 中的一种特殊的重定向方式,用来**将输入重定向到一个交互式 Shell 脚本或程序。 **
它的基本的形式如下:
command << delimiter
document
delimiter
作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。
🐖 注意:
结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
开始的delimiter前后的空格会被忽略掉。
delimiter表示一种分割符,如EOF,tag
/dev/null 文件
- /dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
$ command > /dev/null
- /dev/null 文件非常有用,将命令的输出重定向到它,会起到**“禁止输出”**的效果。
如果希望屏蔽 stdout 和 stderr,可以这样写:
$ command > /dev/null 2>&1
Shell 文件包含
Shell 也可以引用外部脚本,可以封装一些公用的代码作为一个独立的文件。
创建两个 shell 脚本文件。
test1.sh
代码如下:
#!/bin/bash
url="http://www.runoob.com"
test2.sh
代码如下:
#!/bin/bash
#使用 . 号来引用test1.sh 文件
. ./test1.sh # 或者 source ./test1.sh
echo "菜鸟教程官网地址:$url"
🐖 注:为 test2.sh 添加可执行权限并执行,但被包含的文件 test1.sh 不需要可执行权限。
&>/dev/null讲解
参考文章 &>/dev/null表示的意思
https://blog.csdn.net/long2746004900/article/details/53367353
1./dev/null
的作用:把 stdout 送到 /dev/null 里面,丢弃掉该信息,即不输出任何信息到终端
/dev/null 是 Unix/Linux 里的【无底洞】,任何的 output 送去了【无底洞】就再也没了。一般呢,要是你不想看到 output 或者output 太多太大了,有可能把硬碟给挤爆了的时候,程序的设计就会考虑把 output 送到 /dev/null 了。
2.&>/dev/null的含义
1:>
代表重定向到哪里,例如:echo “123” > /home/123.txt
2:/dev/null
代表空设备文件
3:2>
表示stderr标准错误
4:&
表示等同于的意思,2>&1,表示2的输出重定向等同于1
5:1
表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于 “1>/dev/null”
shift命令
shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理(常见于Linux中各种程序的启动脚本)
参考文章 Linux shell脚本中shift的用法说明
https://blog.csdn.net/zhu_xun/article/details/24796235
useradd命令
useradd
命令 可用来建立用户帐号。帐号建好之后,再用 passwd
设定帐号的密码。而可用 userdel
删除帐号。
使用 useradd 指令所建立的帐号,实际上是保存在 /etc/passwd 文本文件中。
crontab的语法
crontab [-u username] [-l|-e|-r]
选项与参数:
-u :只有 root 才能进行这个任务,亦即帮其他使用者创建/移除 crontab 工作排程;
-e :编辑 crontab 的工作内容,弹出vim窗口
-l :查阅 crontab 的工作内容,列出该用户所有的定时任务
-r :移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑(清空内容即可)
🐖 修改/etc/crontab
(文本文件)这种方法只有root用户能用,这种方法更加方便直接给其他用户设置计划任务,而且还可以指定执行shell等等;
🐖 crontab -e
这种所有用户都可以使用,普通用户也只能为自己设置计划任务。然后自动写入/var/spool/cron/usename
crontab -e
# 此时会进入 vi 的编辑画面让您编辑工作!注意到,每项工作都是一行。
#分 时 日 月 周 |<==============任务的完整命令行
* * * * * /home/blue/do/rsyncfile.sh # 同步数据
🐖 【周与日月不可同时并存 】
『你可以分别以周或者是日月为单位作为循环,但你不可使用「几月几号且为星期几」的模式工作』。
🐖 *(星号)
代表任何时刻都接受的意思!
/n
n 代表数字,亦即是『每隔 n 单位间隔』的意思,例如每五分钟进行*/5 * * * * command
🐖 备注:在 Linux 底下的 crontab 会自动的帮我们每分钟重新读取一次 /etc/crontab 的例行工作事项,但是某些原因或者是其他的 Unix 系统中,由於 crontab 是读到内存当中的,所以在你修改完 /etc/crontab 之后,可能并不会马上运行, 这个时候请重新启动 crond 这个服务吧!『/etc/init.d/crond restart』
basename命令
用于去除路径和文件后缀部分后,得到的文件名或者目录名
basename命令格式:最多接受两个参数
第一种使用方式:删除路径最后一个"/“符号(包括”/")前面的所有内容
basename [string]
eg:
basename /tmp/test/file.txt
输出 file.txt
第二种使用方式:suffix为后缀,如果suffix被指定了,basename会将string中的suffix去掉
basename [string] [suffix]
eg:
basename /tmp/test/file.txt .txt
输出 file
去掉指定字符串
file=$filename.txt
name=${file/.txt/}
echo $name
字符串截取
Shell字符串截取(非常详细)http://c.biancheng.net/view/1120.html
1.从指定位置开始截取
- 从字符串左边开始计数,具体格式如下:
${string: start :length}
其中,string 是要截取的字符串,start 是起始位置(从左边开始,从 0 开始计数),length 是要截取的长度(省略的话表示直到字符串的末尾)。
- 从右边开始计数,具体格式如下:
${string: 0-start :length}
🐖
- 从左边开始计数时,起始数字是 0(这符合程序员思维);从右边开始计数时,起始数字是 1(这符合常人思维)。计数方向不同,起始数字也不同。
- 不管从哪边开始计数,截取方向都是从左到右。
2.从指定字符(子字符串)开始截取
1)使用 #
号截取右边字符
🐖注意,以下写法遇到第一个匹配的字符(子字符串)就结束了。往右边数
${string#*chars}
其中,string 表示要截取的字符,chars 是指定的字符(或者子字符串)
-
*
是通配符的一种,表示任意长度的字符串。如果不需要忽略 chars 左边的字符,那么也可以不写*
,则需要写出实际的字符。.
*chars连起来使用的意思是:忽略左边的所有字符,直到遇见 chars(chars 不会被截取)。 -
如果希望直到最后一个指定字符(子字符串)再匹配结束,那么可以使用
##
,具体格式为:
${string##*chars}
2)使用 %
截取左边字符
使用%号可以截取指定字符(或者子字符串)左边的所有字符,具体格式如下:
其它规则同#
,但是往左边数。
${string%chars*}
例如
#!/bin/bash
url="http://c.biancheng.net/index.html"
echo ${url%/*} # http://c.biancheng.net
echo ${url%%/*} # http:
echo ${url%/} # http://c.biancheng.net/index.html
echo ${url%/index.html} # http://c.biancheng.net
echo ${url#*/} # /c.biancheng.net/index.html
echo ${url##*/} # index.html
echo ${url#} # http://c.biancheng.net/index.html
echo ${url#http:/} # /c.biancheng.net/index.html
exit命令
Shell exit命令:退出当前进程 http://c.biancheng.net/view/1145.html
exit
是一个 Shell 内置命令,用来退出当前 Shell 进程,并返回一个退出状态;
exit
命令可以接受一个整数值作为参数,代表退出状态。如果不指定,默认状态值是 0。- 一般情况下,退出状态为 0 表示成功,退出状态为非 0 表示执行失败(出错)了。
🐖 exit 退出状态只能是一个介于 0~255 之间的整数,其中只有 0 表示成功,其它值都表示失败。 - 程序退出后,紧接着使用
$?
可以接收这个退出状态,从而判断程序是正常退出还是非正常退出。