LinuxShell脚本攻略--第一章

使用 shell 进行数学运算:

#!/bin/bash
no1=4;
no2=5;

let result=no1+no2
echo $result

result=$[ $no1 + no2 ]

result=$(( no1 + 50 ))

result=`expr 3 + 4`
result=$(expr $no1 + 5)

echo "4 * 0.56" | bc
result=`echo "$no * 1.5" | bc`
echo $result

echo "scale=2;3/8" | bc        #0.37
no=100
echo "obase=2;$no" | bc
no=1100100
echo "obase=10;ibase=2;$no" | bc

将错误信息重定向到文件:

cmd 2>stderr.txt 1>stdout.txt    #stderr 单独重定向到一个文件,将 stdout 重定向到另一个文件
cmd &> output.txt    #还可以利用更好的方法将 stderr 转换成 stdout ,使得 stderr 和 stdout都被重定向到同一个文件中

tee 既可以将数据重定向到文件,还可以提供一份重定向数据的副本作为后续命令的 stdin 。在下面的代码中, tee 命令接收到来自 stdin 的数据。它将 stdout 的一份副本写入文件out.txt,同时将另一份副本作为后续命令的 stdin 。命令 cat -n 将从 stdin 中接收到的每一行数据前加上行号并写入 stdout

$ cat a* | tee out.txt | cat -n
cat: a1: Permission denied
     1    a
     2    a
     3    a
     4    a
     5    a

 $ cat out.txt
  a1
  a1

注意, cat: a1: Permission denied 并没有在文件内容中出现。这是因为这些信息属于 stderr ,而 tee 只能从 stdin 中读取.默认情况下, tee 命令会将文件覆盖,但它提供了一个 -a 选项,用于追加内容.如: $ cat a* | tee -a out.txt | cat –n 。
我们可以使用stdin所谓命令参数。只需要将-作为命令的文件名参数即可:$ cmd1 | cmd2 | cmd -

$ echo who is this | tee -
who is this
who is this

重定向时

> 等同于 1> ;对于 >> 来说,情况也类似(即 >> 等同于 1>> )。处理错误时,来自 stderr 的输出被丢弃到文件/dev/null中。/dev/null是一个特殊的设备文件,它接收到的任何数据都会被丢弃。null设备通常也被称为黑洞,因为凡是到这儿的数据都将一去不返。

有时需要对文本块(多行文本)进行重定向,就像对标准输入做的那样。考虑一个特殊情况:源文本就位于shell脚本中。一个实用的例子是向log文件中写入头部数据。
a.sh

#!/bin/bash
cat<<EOF>log.txt
LOG FILE HEADER
This is a test log file
Function: System statistics
EOF

在 cat <<EOF>log.txt 与下一个 EOF 行之间的所有文本行都会被当做 stdin 数据.

数组

#!/bin/bash
arr=(‘f‘ ‘z‘ ‘k‘ ‘b‘ ‘a‘)      #很多种方式创建数组
array_var[0]="test1"
array_var[1]="test2"

echo ${arr[2]}
echo ${array_var[0]}
echo ${#arr[*]}           #获取数组的长度

declare -A fruits_value      #定义关联数组
fruits_value=([apple]=‘100dollars‘ [orange]=‘150 dollars‘)
echo ${fruits_value[apple]}
echo ${!fruits_value[*]}      #获取数组的每个索引值,也可以用下面的方法   orange apple
echo ${!fruits_value[@]}

别名:

alias install=‘sudo apt-get install‘ 就可以用install代替命令。但这样关闭终端就会消失,可以在~/.bashrc中:echo ‘alias cmd="command seq"‘ >> ~/.bashrc。如果需要删除别名,只用将其对应的语句(如果有的话)从 ~/.bashrc 中删除,或者使用 unalias 命令。或者使用 alias example= ,这会取消名为 example的别名。有些时候在我们建了别名的时候在使用命令时不想使用别名而是想使用原来的命令,在命令前加上\,像:\command

日期:              日期内容

星期              %a(例如:Sat)
                %A(例如:Saturday)
月                 %b(例如:Nov)
                %B(例如:November)
日                 %d(例如:31)
固定格式日期(mm/dd/yy)       %D(例如:10/18/10)
年                 %y(例如:10)
                  %Y(例如:2010)
小时                %I或%H(例如:08)
分钟                %M(例如:33)
秒                 %S(例如:10)
纳秒                   %N(例如:695208515)
Unix纪元时(以秒为单位)        %s(例如:1290049486)

$ date +%s
1481029113
$ date --date "Thu Nov 18 08:07:21 IST 2010" +%s
1290047841
$ date --date "Jan 20 2001" +%A
Saturday
$date "+%d %B %Y"
06 十二月 2016

函数:

函数声明:

function fname(){
    statements;
}
或者:
fname(){
    statements;
}调用:
fname arg1 arg2 ; #传递参数

? $1 是第一个参数。
? $2 是第二个参数。
? $n 是第n个参数。
? "[email protected]" 被扩展成 "$1" "$2" "$3" 等。
? "$*" 被扩展成 "$1c$2c$3" ,其中 c 是IFS的第一个字符。
? "[email protected]" 要比 "$*" 用得多。由于 "$*" 将所有的参数当做单个字符串,因此它很少被使用
$? 用来代替上一个指令的返回值。

开启一个子shell:用(),在()中写子shell的代码

read命令:

(1) 下面的语句从输入中读取n个字符并存入变量 variable_name :
read -n number_of_chars variable_name
例如:
$ read -n 2 var
$ echo $var

(2) 用无回显的方式读取密码:
read -s var
(3) 显示提示信息:
read -p "Enter input:"  var
(4) 在特定时限内读取输入:
read -t timeout var
例如:
$ read -t 2 var   #在2秒内将键入的字符串读入变量var
(5) 用特定的定界符作为输入行的结束:
read -d delim_char var
例如:
$ read -d ":" var
hello:  #var 被设置为 hello

书中有个例子,运行命令直至成功

repeat() { while true; do [email protected] && return; done }

在大多数现代系统中, true 是作为/bin中的一个二进制文件来实现的。这就意味着每执行一次 while 循环,shell就不得不生成一个进程。如果不想这样,可以使用shell内建的“ : ”命令,它总是会返回为0的退出码:

repeat() { while :; do [email protected] && return; done }

这里记住ture和:的区别就可以了。
用上面那个脚本的可能环境是下载一个文件的时候:repeat wget -c http://www.example.com/software-0.1.tar.gz

for 循环:

for var in list;  #echo {1..50} 能够生成一个从1~50的数字列表
do
  commands;
done

for 循环也可以采用C语言中 for 循环的格式。例如:

for((i=0;i<10;i++)){
  commands; #使用变量$i
}

while 循环

while condition
do
  commands;
done

util循环

x=0;
until [ $x -eq 9 ];
do
  let x++; echo $x;
done

比较:

if condition;
then
    commands;
else if condition;
then
    commands;
else
    commands;
fi

这里有一个技巧:if 和 else 语句可以进行嵌套。 if 的条件判断部分可能会变得很长,但可以用逻辑运算符将它变得简洁一些:
  [ condition ] && action; # 如果 condition 为真,则执行 action ;
  [ condition ] || action; # 如果 condition 为假,则执行 action 。
&& 是逻辑与运算符, || 是逻辑或运算符。编写Bash脚本时,这是一个很有用的技巧。

算术比较
条件通常被放置在封闭的中括号内。一定要注意在 [ 或 ] 与操作数之间有一个空格。如果忘记了这个空格,脚本就会报错。例如:
[$var -eq 0 ] or [ $var -eq 0]    #这个是错误的 因为第一个$var 前和第二个 0的后没有空格
对变量或值进行算术条件判断:
[ $var -eq 0 ] #当 $var 等于 0 时,返回真
[ $var -ne 0 ] #当 $var 为非 0 时,返回真
其他重要的操作符如下所示。
-gt :大于。
-lt :小于。
-ge :大于或等于。
-le :小于或等于。
可以按照下面的方法结合多个条件进行测试:
[ $var1 -ne 0 -a $var2 -gt 2 ] #使用逻辑与-a
[ $var1 -ne 0 -o var2 -gt 2 ] #逻辑或 -o

字符串比较:

使用字符串比较时,最好用双中括号,因为有时候采用单个中括号会产生错误,所以最好避开它们。
[[ $str1 = $str2 ]] :当 str1 等于 str2 时,返回真。也就是说, str1 和 str2 包含的文本是一模一样的。
[[ $str1 == $str2 ]] :这是检查字符串是否相等的另一种写法。也可以检查两个字符串是否不同。
[[ $str1 != $str2 ]] :如果 str1 和 str2 不相同,则返回真。我们还可以检查字符串的字母序情况,具体如下所示。
[[ $str1 > $str2 ]] :如果 str1 的字母序比 str2 大,则返回真。
[[ $str1 < $str2 ]] :如果 str1 的字母序比 str2 小,则返回真。
[[ -z $str1 ]] :如果 str1 包含的是空字符串,则返回真。
[[ -n $str1 ]] :如果 str1 包含的是非空字符串,则返回真。
注意在 = 前后各有一个空格。如果忘记加空格,那就不是比较关系了,而变成了赋值语句。

文件系统相关测试
[ -f $file_var ] :如果给定的变量包含正常的文件路径或文件名,则返回真。
[ -x $var ] :如果给定的变量包含的文件可执行,则返回真。
[ -d $var ] :如果给定的变量包含的是目录,则返回真。
[ -e $var ] :如果给定的变量包含的文件存在,则返回真。
[ -c $var ] :如果给定的变量包含的是一个字符设备文件的路径,则返回真。
[ -b $var ] :如果给定的变量包含的是一个块设备文件的路径,则返回真。
[ -w $var ] :如果给定的变量包含的文件可写,则返回真。
[ -r $var ] :如果给定的变量包含的文件可读,则返回真。
[ -L $var ] :如果给定的变量包含的是一个符号链接,则返回真。

时间: 2024-10-20 09:10:27

LinuxShell脚本攻略--第一章的相关文章

[老齐的求职攻略] 第一章 求职必修课

第一章 求职必修课 "欲先攻其事,必先利其器."每一个赤手空拳征战沙场的人,都有一颗无知者无畏的心,匹夫之勇.精神可嘉,可惜大多下场惨淡,都是电视剧里永远活不过第二集的主.本章我就来说说求职前我们必须要了解的注意事项. 公司的求职流程是怎样的? 公司研发部向HR提出招聘申请,并提出具体用人要求. 人力资源(HR)在智联.猎聘.前程等招聘平台发布招聘信息. 你在招聘网站投递个人简历. HR对收到的简历进行筛选,符合要求者电话邀约. 你收到HR电话邀约,确定面试时间. 当日准时前往面试地点

LinuxShell脚本攻略--第四章 让文本飞

grep $ grep pattern filename #搜索filename下的包含pattern的行$ grep "pattern" filename$ grep -E "[a-z]+" filename #正则匹配添加参数-E或者下面的egrep$ egrep "[a-z]+" filename$ echo this is a line. | egrep -o "[a-z]+\." #只输出匹配的文本部分 -oline

《Linux Shell脚本攻略》 笔记 第一章:Shell起步基础

<Linux Shell脚本攻略> 笔记 第一章:Shell起步基础 1.变量:在bash中,每一个变量的值都是字符串.无论你给变量赋值时,有没有使用引号,值都会以字符串的形式存储. 2.var=value; //赋值操作 var = value: //相等操作 3.获取字符串的长度 [[email protected] ~]$ var=yang [[email protected] ~]$ length=${#var} [[email protected] ~]$ echo $length

《Linux Shell脚本攻略》 笔记 第二章:常用命令

<Linux Shell脚本攻略> 笔记 第二章:常用命令 1.cat cat -s //多个空白行压缩成一个 cat *.txt | tr -s '\n'   //移除空白行 cat -n //加行号 2.find 沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作. eg: find ./ ! -name "*.txt" -print [[email protected] program_test]# find ./  -type f -name "

《Linux Shell脚本攻略》 笔记 第三章:文件操作

<Linux Shell脚本攻略> 笔记 第三章:文件操作 1.生产任意大小的文件 [[email protected] dd_test]# [[email protected] dd_test]# dd if=/dev/zero of=junk.data bs=1k count=10 10+0 records in 10+0 records out 10240 bytes (10 kB) copied, 0.00137023 s, 7.5 MB/s 2.文件系统相关测试 [ -f $file

《Linux Shell脚本攻略》 笔记 第四章:高效文本处理

<Linux Shell脚本攻略> 笔记 第四章:高效文本处理 1.IP地址的正则表达式: [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3} 2.grep用法 //在多级目录中对文本进行递归检索 [[email protected] program_test]# grep "yang" ./ -Rn ./test.txt:6:laoyang ./right.txt:1:1 yang man //忽略大小写匹配 [[email pr

《Linux Shell脚本攻略》 笔记 第六章:打包压缩

<Linux Shell脚本攻略> 笔记 第六章:打包压缩 //1.打包.解包 [[email protected] program_test]# tar -cf output.tar 11.txt 22.txt 33.txt [[email protected] program_test]# tar -xf output.tar -C ./tar-file/  //-C指定要提取到哪个路径? //列举出归档文件中的内容 [[email protected] program_test]# ta

老李分享:《Linux Shell脚本攻略》 要点(一)

老李分享:<Linux Shell脚本攻略> 要点(一) 第一章:Shell起步基础 1.变量:在bash中,每一个变量的值都是字符串.无论你给变量赋值时,有没有使用引号,值都会以字符串的形式存储. 2.var=value; //赋值操作 var = value: //相等操作 3.获取字符串的长度 [[email protected] ~]$ var=yang [[email protected] ~]$ length=${#var} [[email protected] ~]$ echo

Linux Shell脚本攻略(1.12)

1.12 函数和参数 和其他脚本语言一样,Bash同样支持函数,并且可以传递参数. 1.12.1 函数定义和传参 #!/bin/bash function fname() #也可以用fname()代替 { echo $1,$2; #访问参数1和参数2 echo "[email protected]"; #以列表的方式一次性打印所有参数 echo "$*"; #类似于[email protected],但是参数被作为单个实体 return 0; #返回值 } fnam