Linux Shell笔记
echo -e包含转义序列的字符串
echo -e "1\t2\t3"
每种颜色都有对应的颜色码,比如:重置=0,黑色=30,红色=31,绿色=32,黄色=33,蓝色=34,洋红=35,青色=36,白色=37。
\e[1;31将颜色设为红色,\e[0m将颜色重新置回
echo -e "\e[1;31m This is red text \e[0m"
export命令用来设置环境变量。至此以后,从当前shell脚本执行的任何程序都会继承这个变量。常用环境变量:HOME、PWD、USER、UID、SHELL等。
PATH就是其中之一,如果需要在PATH中添加一条新路径,可以使用
export PATH="$PATH:/home/user/bin"
常用变量技巧
1.获得字符串长度
$ var=1234567890 $ echo ${#var}
2.识别当前的shell版本
$ echo $SHELL
3.检查是否为超级用户
if [ $UID -ne 0 ]; then echo Non root user. Please run as root. else echo "Root user" fi
4.修改Bash提示字符串(username@hostname:~$)
slynux@localhost: ~$ PS1="PROMPT>" PROMPT> Type commands here
数学运算
可以利用let、(())和[]执行基本的算术操作。
自加操作 $ let no++
自减操作 $ let no--
简写形式 了let no+=6
result=$[ no1 + no2 ] 也可以使用$前缀 result=$[ $no1 + 5 ]
result=$(( no1 + 50 ))
result=`expr 3 + 4`
result=$(expr $no1 + 5)
以上这些方法只能用于整数运算,而不支持浮点数。
bc是一个用于数学运算的高级工具。
设定小数精度(数值范围)
$ echo "scale=2;3/8" | bc 0.37
进制转换
no=100 echo "obase=2;$no" | bc 1100100 no=1100100 echo "obase=10;ibase=2;$no" | bc 100
计算平方以及平方根
echo "sqrt(100)" | bc echo "10^10" | bc
可以使用tee一方面将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin。
默认情况下,tee命令将会将文件覆盖,-a选项,可以用于追加内容。
$ cat a* | tee -a out.txt | cat -n
将文件重定向到命令
$ cmd < file
重定向脚本内部的文本块
#!/bin/bash cat <<EOF>log.txt LOG FILE HEADER This is a test log file Function: System statistics EOF
在单行中使用一列值来定义一个数组
array_var=(1 2 3 4 5 6)
还可以将数组定义成一组索引-值(index-value pair)
array_var[0]="test1" array_var[1]="test2" array_var[2]="test3" array_var[3]="test4" array_var[4]="test5" array_var[5]="test6"
打印特定索引的数组元素内容:
$ echo ${array_var[0]} test1 index=5 $ echo ${array_var[$index]}
test6
以清单形式打印出数组中的所有值:
$ echo ${array_var[*]} test1 test2 test3 test4 test5 test6
也可以使用:
$ echo ${array_var[@]} test1 test2 test3 test4 test5 test6
打印数组长度(即数组中原书的个数):
$ echo ${#array_var[*]}
6
定义关联数组
$ declare -A ass_array
将元素添加到关联数组
$ ass_array=([index1]=val1 [index2]=val2)
$ ass_array[index1]=val1
$ ass_array[index2]=val2
列出数组索引
$ echo ${!array_var[*]}
也可以使用:
$ echo ${!array_var[@]}
对于普通数组,这个方法同样可行。
创建别名
$ alias rm='cp $@ ~/backup; rm $@'
为了使别名设置一直保持作用,可以将它放入~/.bashrc文件中。
$ echo 'alias cmd="command seq"' >> ~/.bashrc
字符\对命令实施转义,使我们可以执行原本的命令,而不是别名替身。
$ \command
获取终端的行数和列数:
tput cols
tput lines
打印当前终端名:
tput longname
将光标移动到方位(100,100)处:
tput cup 100 100
设置终端背景色:
tput setb no
其中,no可以在0-9之间取值。将文本前景色设为白色:
tput setf 9
设置文本样式为粗体:
tput bold
设置下划线的起止:
tput smul
tput rmul
删除当前光标位置到行尾的所有内容:
tput ed
在输入密码的时候,不能让输入的内容显示出来。
#!/bin/sh #Filename: password.sh echo -e "Enter password: " stty -echo read password stty echo echo echo Password read.
打印纪元时:
$ date --date "Thu Nov 18 08:07:21 IST 2010" +%s
1290047841
使用格式串结合+作为date命令的参数,打印出对应格式的日期。
$ date "+%d %B %Y" 31 December 2015
设置日期和时间:
# date -s "格式化的日期字符串"
ex:
# date -s "21 June 2009 11:01::22" Sun Jun 21 11:01:22 CST 2009
检查一组命令花费的时间
#!/bin/bash #文件名:time_take.sh start=$(date +%s) commands; statements; end=$(date +%s) difference=$(( end - start )) echo Time taken to execute commands is $difference seconds.
使用tput和sleep从0开始计数到40:
#!/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
调试脚本
set -x: 在执行时显示参数和命令。
set +x: 禁用调试。
set -v: 当命令进行读取时显示输入。
set +v: 禁止打印输入。
#!/bin/bash #Filename: debug.sh for i in {1..6} do set -x echo $i set +x done echo "Script executed"
可以通过传递_DEBUG环境变量来建立自定义格式显示的调试信息
在Bash中,命令':'告诉shell不要进行任何操作。
#!/bin/bash function DEBUG() { [ "$_DEBUG" == "on" ] && $@ || : } for i in {1..10} do DEBUG echo $i done
$ _DEBUG=on ./script.sh
函数定义
fname() { echo $1, $2; # 访问参数1和参数2 echo "$@"; # 以列表的方式一次性打印所有参数 echo "$*"; # 类似于$@,但是参数被作为单个实体 return 0; # 返回值 }
返回值被称为退出状态,用于分析命令执行成功与否。
#!/bin/bash #Filename: success_test.sh CMD="command" # command指你要检测退出与否的目标命令 status $CMD if [ $? -eq 0 ]; then echo "$CMD executed successfully" else echo "$CMD terminated unsuccessfully" fi
读取命令序列输出
子shell(subshell)方式。
子shell本身就是独立的进程。可以使用()操作符来定义一个子shell:
cmd_output=$(ls | cat -n) echo $cmd_output
反引用(back-quote)方式。
cmd_output=`COMMANDS`
假如我们使用子shell或反引用的方式将命令的输出读入一个变量中,可以将它放入双引号中,以保留空格和换行符(\n)。
$ cat text.txt 1 2 3 $ out=$(cat text.txt) $ echo $out 1 2 3 # 丢失了换行符 \n $ out="$(cat text.txt)" echo $out 1 2 3
read命令
从输入中读取n个字符并存入变量variable_name:
$ read -n 2 var $ echo $var
不回显(non-echoed)的方式读取密码:
read -s var
显示提示信息:
read -p "Enter input:" var
在特定时限内读取输入:
$ read -t 2 var
用定界符结束输入行:
$ read -p ":" var hello: #var被设置为hello
IFS是存储定界符的环境变量
#!/bin/bash #用途:演示IFS的用法 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;
for循环
for i in {a..z}; do actions; done;
for((i=0;i<10;i++)) { commands; #使用变量$i }
while循环
while condition do commands; done
until循环
x=0; until [ $x -eq 9 ]; do let x++; echo $x; done
if条件
if condition; then commands; fi
else if 和 else:
if condition; then commands; elif condition; then commands else commands fi
逻辑运算符
[ condition ] && action; # 如果condition为真,则执行action
[ condition ] || action; # 如果condition为假,则执行action
算术比较
[ $var -eq 0 ] or [ $var -ne 0 ]
-gt: 大于
-lt: 小于
-ge: 大于或等于
-le: 小于或等于
多条件判断
[ $var1 -ne 0 -a $var2 -gt 2 ] # 使用逻辑与 -a [ $var1 -ne 0 -o $var2 -gt 2 ] # 逻辑或 -o
文件系统相关测试
[ -f $file_var ]; 如果给定的变量包含正常的文件路径和文件名,则返回真。 [ -x $var ]; 如果给定的变量包含的文件可执行,则返回真。 [ -d $var ]; 如果给定的变量包含的是目录,则返回真。 [ -e $var ]; 如果给定的变量包含的文件存在,则返回真。 [ -c $var ]; 如果给定的变量包含的是一个字符设备文件的路径,则返回真。 [ -b $var ]; 如果给定的变量包含的是一个块设备文件的路径,则返回真。 [ -w $var ]; 如果给定的变量包含的文件可写,则返回真。 [ -r $var ]; 如果给定的变量包含的文件可读,则返回真。 [ -L $var ]; 如果给定的变量包含的是一个符号链接,则返回真。
字符串比较
[[ $str = $str2 ]] 当str1等于str2时,返回真。 [[ $str1 == $str2 ]] 检查字符串是否相等的,另一种写法。 [[ $str1 != $str2 ]] 如果str1和str2不相同,则返回真。 [[ $str1 > $str2 ]] 如果str1的字母序比str2大,则返回真。 [[ $str1 < $str2 ]] 如果str1的字母序比str2小,则返回真。 [[ -z $str1 ]] 如果str1包含的是空字符串,则返回真。 [[ -n $str1 ]] 如果str1包含的是非空字符串,则返回真。
cat
读取文件并拼接数据,-被作为来自stdin文本的文件名
$ echo 'Text through stdin' | cat - file.txt
压缩连续的空白行
$ cat -s file
也可以用tr移除空白行:
$ cat multi_blanks.txt | tr -s '\n'
-T选项能够将制表符标记成^|。
$ cat -T file
-n选项会在输出的每一行内容前加上行号。
$ cat -n file
find
-name选项,根据文件名或正则表达式匹配搜索
$ find /home/slynux -name "*.txt" -print
-iname选项,忽略字母大小写,作用与-name类似。
$ find . -iname "example*" -print
匹配多个条件中的一个
$ find . \( -name "*.txt" -o -name "*.pdf" \) -print
-path选项,将文件路径作为一个整体进行匹配
$ find /home/users -path "*slynux*" -print
-regex选项,基于正则表达式来匹配文件路径。
$ find . -regex ".*\(\.py\|\.sh\)$"
-iregex选项,忽略正则表达式的大小写
$ find . -iregex ".*\(\.py\|\.sh\)$"
否定参数"!"
$ find . ! -name "*.txt" -print
-maxdepth指定最大深度,-mindepath指定最小深度
$ find . -maxdepth 1 type f -print
$ find . -mindepth 2 -type f -print
-type可以对文件搜索进行过滤
$ find . -type d -print
根据文件时间进行搜索
-atime 用户最近一次访问文件的时间
-mtime 文件内容最近一次被修改的时间
-ctime 文件源数据最后一次改变的时间
计量单位是“天”,这些整数值还可以带有-或+:-表示小于,+代表大于。
$ find . -type f -atime -7 -print
$ find . -type f -atime +7 -print
-amin 访问时间
-mmin 修改时间
-cmin 变化时间
计量单位是“分钟”
$ find . -type f -amin +7 -print
-newer参数,可以指定一个用于比较时间戳的参考文件,然后找出比参考文件新的所有文件
$ find . -type f -newer file.txt -print
-size参数,基于文件大小的搜索
$ find . -type f -size +2k # 大于2KB的文件 $ find . -type f -size -2k # 小于2KB的文件 $ find . -type f -size 2k # 等于2KB的文件