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的文件

 

posted @ 2016-01-04 18:14  Edward Guan  阅读(349)  评论(0编辑  收藏  举报