shell
脚本通常是以 #! 起始的文本文件。
有两种运行脚本文件的方式:
- 将脚本作为
sh
命令行参数运行
sh script.sh
- 将脚本作为可执行文件运行
chmod a+x script.sh
. script.sh
2. 终端打印
echo打印
终端打印如上图三种情况:
- 不带引号的
echo
‘;’
字符会用作命令定界符 - 单引号的
echo
无法进行变量替换 - 双引号的
echo
printf
printf
与c
中的printf
函数一样,可以格式化
3. 变量与环境变量
新建变量:var=“value”
查看变量:echo $var
export: 设置环境变量。由当前shell脚本执行的任何应用程序都会继承这个变量。
PS:获取字符串长度:length=$(#var)
4. 使用函数添加环境变量
5. 使用shell进行数学运算
- 基本的运算操作:
- let
let result=no1 + no2
- (())
result=(($no1 + $no2))
或
result=$((no1 + no2))
- []
result=$[no1 + no2]
- let
- 高级操作 bc
6. 文件描述符和重定向
stdin(0)
:标准输入,这个概念有点不太容易理解比如:1.使用<
从文件中读取内容,2.当前命令将内容通过管道传输给下一个命令而下一个命令,而实际内容是传输给了stdin
所以下一个命令也是从stdin
中读取内容。
stdout(1):标准输出;这是默认选项。使用方法:1>
等价于>
或者 1>>
等价于>>
,;如果想使用其它文件描述符,必须将文件描述符放在操作符之前。
stderr(2)
:标准错误,使用方法2>
或者2>>
,标准错误可以将错误信息插入到文件而不在终端显示 。
\<:
从文件中读取内容。
\>
:将内容插入到文件,每次插入前都会清空文件内容。
\>>
:将内容插入到文件, 将内容追加到现有文件的末尾。
自定义文件描述符
使用exec 可以自定义文件描述符,但只能使用一次,如果需要再次读取,需要重新分配。
7. 数组和关联数组
关联数组使用declare来进行声明:8. 别名
alias:
alias install='sudo apt-get install'
使 alias 设置一直保持作用,:
echo alias=‘xxx’ >> ~/.bashrc
每个shell进程的产生,都会执行 ~/.bashrc 中的命令
9. 获取终端信息
作用 | 命令 |
---|---|
获取终端的行数和列数 | 1. tput cols 2. tput lines
|
打印当前终端名 | tput longname |
移动到坐标(100, 100) | tput cup 100 100 |
设置终端背景色 |
tputsetb n n的取值1-7 |
设置文本前景色 |
tputsetf n (ubuntu默认没有这个命令) |
设置文本粗体 | tput bold |
删除从光标位置到行尾的所有内容 | tputed |
#!/bin/bash
#Filename: sleep.sh
echo -n Count;
tput sc #存储光标的位置
count=0;
while true;
do
if [ $count -lt 40 ];
then let count++;
sleep 1;
tput rc #恢复之前的光标的位置
tput ed #删除当前光标位置到行尾之间的所有内容
echo -n $count;
else exit 0;
fi
done
10. 获取设置日期和延时
这个讲的有点简略,用的时候再学
日期内容 | 格式 |
---|---|
星期 |
%a (如:Sat)%A (如:Saturday) |
月 |
%b (如:Nov)%B (如:November) |
日 | %d |
固定格式日期(mm/dd/yy) | %D |
年 |
%y (如:10)%Y (如:2010) |
小时 |
%I 或 %H (如:08) |
分钟 | %M |
秒 | `%S(如:10) |
纳秒 |
%N (如:695208515) |
Unix纪元时 |
%s (如:1290049480) |
11. 调试脚本
跟踪调试 bash -x scripts.sh
set -x
:在执行时显示参数和命令
set +x
:禁止调试
set -v
:当命令进行读取时,显示输入
set +v
:禁止打印输入
10. 函数与参数
参数处理 | 说明 |
---|---|
$# |
传递到脚本的参数个数 |
$* |
以一个单字符串显示所有向脚本传递的参数。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 |
$$ |
脚本运行的当前进程ID号 |
$! |
后台运行的最后一个进程的ID号 |
$@ |
与$*相同,但是使用时加引号,并在引号中返回每个参数。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 |
$- |
显示Shell使用的当前选项,与set命令功能相同。 |
$? |
显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
13. 读取命令序列输出
1.管道组合输出
如:ls | cat -n > out.txt
2.子shell
模板:cmd_output=$(COMMANDS)
如:
cmd_output=$(ls | cat -n)
echo $cmd_output
14. 以不按回车键的方式读取字符‘n’
命令 | 说明 | 实例 |
---|---|---|
read -n number_of_chars variable_name |
读取n个字符并存入变量 | |
read -s var |
用无回显的方式读取密码 | read -s var |
read -p "Enter input:" var |
显示提示信息 | read -p "Enter input:" var |
read -t timeout var |
在特定的时限内读取输入 | read -t 2 var |
read -d delim_char var |
用特定的定界符作为输入行的结束 | read -d ":" var |
`` |
15. 运行命令直至执行成功
按照一下方式定义函数:
repeat()
{
while true
do
$@ && return
done
}
一种更快的做法:
repeat()
{
while :; #shell内建的“:”命令,它总会返回为0的退出码
do
$@ && return
done
}
增加延时
repeat()
{
while :;
do
$@ && return;
sleep 30;
done
}
13. 字段分割符和迭代器
内部字段分隔符IFS(Internal Field Separate)
逗号分隔型数值CSV(Comma Separate Value)
#!/bin/bash
line="root:x:0:0:root:/root:/bin/bash"
oldIFS=$IFS;
IFS=":"
count=0
for item in $line;
do
[ $count -eq 0 ] && user=$item;
[ $count -eq 6 ] && shell=$item;
let count++
done;
IFS=$oldIFS
echo $user\'s shell is $shell;
执行后:root's shell is /bin/bash
14. 比较和测试
#if条件
if condition
then
commands
fi
#else if 和 else
if condition;
then
commands;
else if condition; then
commands;
else
commands;
fi
[ condition ] && action #如果condition为真,则执行action
[ condition ] || action #如果condition为假,则执行action
#算术比较
[ $var -eq 0 ] # 当 $var 等于 0 时, 返回真
[ $var -ne 0] #当$var 非0 时,返回真
-gt #大于
-lt #小于
-ge #大于或等于
-le #小于或等于
文件系统相关测试:
属性 | 作用 |
---|---|
[ -f $file-var ] | 如果给定的变量包含正常的文件路径或文件名,则返回真 |
[ -x $var ] | 给定的变量包含的文件可执行,返回真 |
[ -d $var ] | 是目录,真 |
[ -e $var ] | 文件存在 |
[ -c $var ] | 包含的是一个字符设备文件的路径 |
[ -b $var ] | 是一个块设备文件的路径 |
[ -w $var ] | 包含的文件可写 |
[ -r $var ] | 包含的文件可读 |
[ -L $var ] | 包含的是符号连接 |
#使用方法实例
fpath="/etc/passwd"
if [ -e $fpath ]; then
echo File exists;
else
echo Does not exist;
fi
字符串比较
[ [ $str1 = $str2 ] ] #文本相同
[ [ $str1 == $str2 ] ] # 文本相同
[ [ $str1 != $str2 ] ]
[ [ $str1 > $str2 ] ] #str1的字母序比str2的大,返回真
[ [ $str1 < $str2 ] ]
[ [ -z $str1 ] ] #如果str1包含的是空字符串,则返回真
[ [ -n $str1 ] ] #是非空字符串,返回真