文章目录
- linux脚本攻略第一章
- 终端打印
- echo命令
- printf命令
- 其他注意事项
- 变量
- 数学运算
- let命令
- []和(())操作
- bc运算
- 重定向
- 数组
- 别名
- 终端信息
- 日期相关
- 调试脚本
- 函数和参数
- 管道命令
- 字段分隔符和迭代器
- 循环
- 算术比较
- 文件系统相关测试
- 字符串比较
linux脚本攻略第一章
终端打印
echo命令
- echo加上需要打印的字符。可以将该打印的字符串用单引号或者双引号引起来,也可以直接接该字符串。如
echo hello world
、echo 'hello world'
、echo "hello world"
。 - 如果是转义字符,双引号引起来的字符串需要用转义字符。如
echo "hello world\!"
- 使用不带引号的echo时,不能显示
;
,;
用来表示分割命令。 - 变量替换在单引号中无效。比如
echo '$hello'
,直接输出'$hello'
而不是hello表示的变量。 echo
命令会自动换行。
printf命令
- 示例如下。
printf "hello world"
输出hello world
、printf "%-5s %-10s %-4s\n" No Name Mark
显示No Name Mark
。
其他注意事项
- 如果需要忽略掉
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
。 - 添加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
表示当前工作目录。 {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。也可以在变量前加上[ $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次。
重定向
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
设置下划线终止。
日期相关
- 读取日期一般为
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
的调试信息。
- 将
#!/bin/bash
改为#!/bin/bash -xv
也可以进行调试。
函数和参数
function fname()
{
statements;
}
或
fname()
{
statements;
}
- 调用函数时直接使用
fname;
,传递参数时直接fname arg1 arg2;
- 导出函数。从父进程导出函数到子进程中。
export -f fname
。
管道命令
- 可以通过
cmd_output=$(COMMANDS)
或者cmd_output=`COMMANDS` 来进行读取由管道相连的命令序列的输出。如cmd_output=$(ls | cat -n); echo $cmd_output
。 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
。
字段分隔符和迭代器
循环
for var in list;
do
commands;
done
或
for((i=0; i<10; i++))
{
commands;
}
while condition
do
commands;
done
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是否是非空字符串。