第一章 小试牛刀

shell 脚本通常是以 #! 起始的文本文件。
有两种运行脚本文件的方式:

  • 将脚本作为sh 命令行参数运行
sh script.sh 
  • 将脚本作为可执行文件运行
chmod a+x script.sh
. script.sh

2. 终端打印

echo打印

echo终端打印.png

终端打印如上图三种情况:

  • 不带引号的echo
    ‘;’字符会用作命令定界符
  • 单引号的echo
    无法进行变量替换
  • 双引号的echo
    printf
    printfc 中的 printf 函数一样,可以格式化

3. 变量与环境变量

新建变量:var=“value”
查看变量:echo $var
export: 设置环境变量。由当前shell脚本执行的任何应用程序都会继承这个变量。
PS:获取字符串长度:length=$(#var)

4. 使用函数添加环境变量

Ubuntu系统环境变量详解

5. 使用shell进行数学运算

  • 基本的运算操作:
    • let
      let result=no1 + no2
    • (())
      result=(($no1 + $no2))
      result=$((no1 + no2))
    • []
      result=$[no1 + no2]
  • 高级操作 bc
bc数学运算.png

6. 文件描述符和重定向

stdin(0):标准输入,这个概念有点不太容易理解比如:1.使用<从文件中读取内容,2.当前命令将内容通过管道传输给下一个命令而下一个命令,而实际内容是传输给了stdin所以下一个命令也是从stdin中读取内容。
stdout(1):标准输出;这是默认选项。使用方法:1>等价于> 或者 1>>等价于>>,;如果想使用其它文件描述符,必须将文件描述符放在操作符之前。
stderr(2):标准错误,使用方法2>或者2>>,标准错误可以将错误信息插入到文件而不在终端显示 。
\<:从文件中读取内容。
\>:将内容插入到文件,每次插入前都会清空文件内容。
\>>:将内容插入到文件, 将内容追加到现有文件的末尾。
自定义文件描述符

自定义文件描述符.png

使用exec 可以自定义文件描述符,但只能使用一次,如果需要再次读取,需要重新分配。

7. 数组和关联数组
数组.png

关联数组使用declare来进行声明:
关联数组.png

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 ] ]  #是非空字符串,返回真 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容