文章目录
linux脚本攻略第一章
终端打印
echo命令
- echo加上需要打印的字符。可以将该打印的字符串用单引号或者双引号引起来,也可以直接接该字符串。如
echo hello world
、echo 'hello world'
、echo "hello world"
。 - 如果是转义字符,双引号引起来的字符串需要用转义字符。如
echo "hello world\!"
- 使用不带引号的echo时,不能显示
;
,;
用来表示分割命令。 - 变量替换在单引号中无效。比如
echo '$hello'
,直接输出'$hello'
而不是hello表示的变量。 -
echo
命令会自动换行。
printf命令
- printf和c语言的printf函数一样,并且后面使用引用文本或由空格分割的参数。
- 可以使用格式化字符串,也可以指定字符串宽度、左右对齐方式等。
- 需要手动添加自动换行符,才会换行。
- 示例如下。
printf "hello world"
输出hello world
、printf "%-5s %-10s %-4s\n" No Name Mark
显示No Name Mark
。
其他注意事项
- 使用echo和printf的命令选项时,要确保选项应该在命令行内所有字符串前,否则Bash会将其视为另一个字符串。
- 如果需要忽略掉
echo
命令自动添加的换行符,则需要添加-n
。 - 使用
\e[1;%dm
来设置颜色。黑色=40,红色=41,绿色=42,黄色=43,蓝色=44,洋红=45,青色=46,白色=47,重置=0。重置也可以用\e[0m
来将颜色重新置回。
变量
- 替换
tr str1 str2
。 - 用
var=value
进行赋值,不能使用var = value
,这个语句是用来做判断的。 - 访问变量有两种方式
$var
和${var}
。如echo $var
。 - 环境变量是从父进程(可以是整个操作系统)中继承而来的变量,用export来设置环境变量。
- 添加PATH变量可以用
export PATH="$PATH:/home/user/bin"
。 - 单引号没办法访问变量以及为变量赋值。
-
length=${#var}
获取变量var所代表的变量的长度。 - 识别当前所用shell,
echo $SHELL
或echo $0
。 - 查看当前用户是否是Root。
$UID
如果是0则是root用户,否则不是。 - 设置Bash提示字符串,在
~/bashrc
文件中修改PS1="str"
,str
则为终端提示字符串,也可以使用特殊字符扩展成系统参数。如\u
为用户名,\h
为主机名,\w
表示当前工作目录。 - eval能够二次扫描,即现将后面的命令能够替换的先替换完之后再执行替换后的命令。
-
{parameter:+expression}
如果parameter有值且不为空则使用expression的值。
数学运算
let命令
-
no1=4;no2=5;let result=no1+no2;echo $result;
结果打印为9。 -
let no1++
no1自加1、let no1--
no1自减1、let no1+=6
为no1加6。
[]和(())操作
-
result=$[ no1 + no2 ]
让no1+no2,并将结果赋值给result。也可以在变量前加上 , 如 ‘ r e s u l t = ,如`result= ,如‘result=[ $no1 + $no2 ]`。 - 使用
(())
也可以做运算。如result=$(( no1 + 50 ))
或result=$(( $no1 + 50 ))
。
bc运算
- 可以使用
echo "4 * 0.56" | bc
这种管道命令来计算表达式,或者把需要计算的运算放到文件里,然后调用bc filename
,或者直接在命令行输入bc命令,再执行计算式。bc会自动显示结果不需要再加一个输出。 - 可以通过使用
scale=2
来表示小数点精度,该表达式表示将小数位个数设置为2。可以使用obase=8
来表示进制。如echo "scale=2;3/8" | bc
。 - 可以计算特殊的一些函数或者运算,如
sqrt(100)
计算开平方,10^10
计算10的10次。
重定向
- 文件描述符0表示标准输入,1表示标准输出,2表示标准错误。
-
echo "This is a sample text 1" > temp.txt
会将temp.txt中的数据清空,然后将This is a sample text 1
输入到temp.txt文件中。>
表示清空再加,>>
表示在原有文件基础上追加内容(即不清除)。 -
cat filename
查看文件内容。 - 当一个命令发生错误并退回时会返回一个非0的退出状态,而成功完成的话会返回0,退出状态可以使用变量$?来访问。
$?
记录最近一次错误状态代码。 - 在
>
或>>
加上1表示标准输出,加上2表示标准错误。如ls + 2> err.txt
。 - 当重定向文件
/dev/null
时相当于将输出放到windows的垃圾桶一样。 -
2>&1
或&>
表示将标准错误转换成标准输出。 -
cat a* | tee out.txt | cat -n
tee会将cat a*
的结果放到out.txt中,并备份一份结果给cat -n
处理。tee -a filename
表示追加方式。 -
/dev/stderr
表示标准错误文件,/dev/stdout
表示标准输出文件,/dev/stdin
表示标准输入文件,-
也表示标准输入文件。 - 将文件重定向到命令
cmd < file
。 -
cat<<str>log.txt
会将后面输入的字符串都写入到log.txt中直到输入一行独立的str(str不写入文件)。 - 创建一个文件描述符进行文件读取。
exec 3<input.txt
表示3操作会将input.txt中的数据作为标准输入,则cat <&3
则会把imput.txt中的数据打印出来(不能省略&)。
数组
- 定义数组
array_var=(1 2 3 4 5 6)
表示声明一个数组array_var,并且有元素1,2,3,4,5,6。或者用array_var[index]="str"
来赋值,如array_var[0]="test1"
。 - 打印数组数据。
echo ${array_var[0]}
打印单个值,echo ${array_var[*]}
打印所有值。 - 可以使用
declare -A ass_array
来定义关联数组,使用ass_array=([index1]=val1 [index2]=val2)
或ass_array[index]=val
来赋值。 - 通过
echo ${!array_var[*]}
或${!array_var[@]}
来获取数组索引(下标默认从0开始)。
别名
- 可以按照
alias new_command='command sequence'
。如为安装命令apt-get install创建别名:alias install='sudo apt-get install'
。 - alias命令作用只是暂时的,一旦关闭当前终端,所有设置别名就失效了。为了使别名设置一直保持作用,可以将它放入~./bashrc文件中。如果需要删除别名,使用
unalias
命令alias example=
。 -
\command
可以忽略当前定义的别名。
终端信息
- 获取终端的行号和列数。
tput cols
和tput line
。 - 打印出当前终端名。
tput longname
。 - 将光标移动到坐标(100, 100)处。
tput cup 100 100
。 - 设置终端背景色。
tput setb n
,n可以在0到7之间取值。同理设置终端前景色tput setf n
。 - 设置文本样式为粗体。
tput bold
。 - 设置下划线的起止。
tput smul
设置下划线起始,tput rmul
设置下划线终止。
日期相关
- 在类Unix系统中,日期被存储成一个整数,其大小为自世界标准时间(UTC)1970年1月1日0时0分0秒起所流逝的秒数,这种计时方式称为纪元时或Unix时间。
- 读取日期一般为
date
。data +%s
打印纪元时。 -
date --date "Thu Nov 18 08:07:21 ist 2010" +%s
将字符串时间Thu Nov 18 08:07:21 ist 2010打印成纪元时时间。 - 用格式串结合+作为date命令的参数,用来按照你的选择打印出对应格式的日期。后面一般加
%Y
、%d
、%B
、%s
、%A
等。例子如:date "%d %B %Y"
打印20 May 2010
。 - 设置日期和时间。
date -s "格式化的日期字符串"
。 - 相关日期格式如下表:
日期内容 | 格式 |
---|---|
星期 | %a(例如:Sat)、%A(例如:Saturday) |
月 | %b(例如Nov)、%B(例如:November) |
日 | %d(例如31) |
固定格式日期 | %D(例如:10/18/10) |
年 | %y(例如:10)、%Y(例如2010) |
小时 | %I或%H(例如:08) |
分钟 | %M(例如33) |
秒 | %S(例如10) |
纳秒 | %N(例如695208515) |
Unix纪元时 | %s(例如:1290049486) |
调试脚本
- 使用-x来启动shell脚本的跟踪调试功能,如
bash -x script.sh
或sh -x script
,会打印出所执行的每一行命令以及当前状态。 - 也可以使用
set -x
和set +x
来对部分脚本进行调试。如
#!/bin/bash
for i in {1..6};
do
set -x
echo $i
set +x
done
echo `Script executed`
只会打印出echo $i
的调试信息。
- set -x:执行时显示参数和命令。
- set +x:禁止调试。
- set -v:当命令进行读取时显示输入。
- set +v:禁止打印输入。
- 将
#!/bin/bash
改为#!/bin/bash -xv
也可以进行调试。
函数和参数
- 定义函数
function fname()
{
statements;
}
或
fname()
{
statements;
}
- 调用函数时直接使用
fname;
,传递参数时直接fname arg1 arg2;
- $1是第一个参数,$2是第二个参数,依此类推。
- “$@“被扩展为”$1” "$2"等。
- "$*“被扩展为”$1c$2c$3"等,其中c为IFS的第一个字符。
- 导出函数。从父进程导出函数到子进程中。
export -f fname
。
管道命令
- 可以通过
cmd_output=$(COMMANDS)
或者cmd_output=`COMMANDS` 来进行读取由管道相连的命令序列的输出。如cmd_output=$(ls | cat -n); echo $cmd_output
。 - ()可以定义一个子shell。当命令在子shell中执行时,不会对当前shell有任何影响,所有改变仅限于子shell中,并且可以通过引用子shell的方式保留空格和换行符。
-
read -n number_of_chars variable_name
从 输入中读取n个字符并存入变量variable_name。 - 用无回显的方式读取密码。
read -s var
,即输入的字符串不会显示出来。 -
read -p "Enter input:" var
。Enter input:
为提示信息。 -
read -t timeout var
。在限定时间内输入,如read -t 2 var
。 -
read -d delim_char var
。输入直到遇到定界符才结束。如read -d ":" var
。
字段分隔符和迭代器
- 内部字段分隔符是存储定界符的环境变量,它是当前shell环境使用的默认定界字符串。
循环
- for循环。
for var in list;
do
commands;
done
或
for((i=0; i<10; i++))
{
commands;
}
- while循环。
while condition
do
commands;
done
- until循环
until condition
do
commands;
done
算术比较
-
-gt
:大于。 -
-lt
:小于。 -
-ge
:大于或等于。 -
le
:小于或等于。 -
-eq
:等于。 -
-nq
:不等于。 -
-a
:逻辑与。 -
-o
:逻辑或。
文件系统相关测试
-
-f $file_var
:如果给定的变量包含正常的文件路径或文件名,则返回真。 -
-x $var
:如果给定的变量包含的是可执行文件,则返回真。 -
-d $var
:如果给定的变量包含的是目录,则返回真。 -
-e $var
:如果给定的变量包含的文件存在,则返回真。 -
-c $var
:如果给定的变量包含的是一个字符设备文件的路径,则返回真。 -
-b $var
:如果给定的变量包含的是一个块设备文件的路径,则返回真。 -
-w $var
:如果给定的变量包含的文件可写,则返回真。 -
-r $var
:如果给定的变量包含的文件可读,则返回真。 -
-L $var
:如果给定的变量包含的是一个符号链接,则返回真。
字符串比较
-
[[ $str1 = $str2 ]]
。判断两个字符串相等。 -
[[ $str1 == $str2 ]]
。判断两个字符串相等。 -
[[ $str1 != $str2 ]]
。判断两个字符串不相等。 -
[[ $str1 > $str2 ]]
。判断str1大于str2。 -
[[ $str1 < $str2 ]]
。判断str1小于str2。 -
[[ -z $str ]]
。判断str是否是空字符串。 -
[[ -n $str ]]
。判断str是否是非空字符串。