Shell入门

变量

变量

变量引用:$ 和 ${}

命令替换

命令输出中提取信息,并将其赋给变量
反引号 和 $()

wu=`命令` 或者 wu =$()

注意:`` 和 $() 与= 不能有空格

echo/读取:read

echo命令可用单引号或双引号来划定文本字符串,便可以正常输出。
echo -n :文本字符串和命令输出显示在同一行中

read -p "Enter your age:" name
echo "hello $name"

read –p 相当于 echo -n 提示作用

read -p "Enter your name: " first last
echo "Checking data for $last, $first…"
-t 指定时间
-s 隐藏输入内容(可用于输入密码)

read 文件内容
count=1
cat test | while read line
do
  echo "Line $count: $line"
  count=$[ $count + 1 ]
done

标准输入输出

ls -la t test3 test4 2>text1 1>text
&>test 则正确和错误输入到同一个文件

运算符

expr

处理数学表达式
ARG1 | ARG2 如果ARG1既不是null也不是零值,返回ARG1;否则返回ARG2
ARG1 & ARG2 如果没有参数是null或零值,返回ARG1;否则返回0
ARG1 % ARG2 返回ARG1被ARG2除的算术余数
*号等运算符识别不出 需要 加 \
expr 5 \* 2

整数运算$[ ]

bash shell数学运算符只支持整数运算
var1=$[1+5]

var1=[var * 2]


浮点运算 bc

直接输入bc,进行运算
–q 不显示bash计算器冗长的欢迎信息
scale 控制小数位数



if结构化语句

If 条件;then
fi

If 条件;then
else
fi

if 条件;then
elif 条件;then
fi

方括号定义了测试条件。注意,第一个方括号之后和第二个方括号之前必须加上一个空格,否则就会报错
if [ condition ]
then
commands
fi

数值比较

-eq 相等
-ge 大于或等于
-gt 大于
-le 小于或等于
-lt 小于
-ne 不等于

字符串比较

str1 = str2 检查str1是否和str2相同
str1 != str2 检查str1是否和str2不同
str1 < str2 检查str1是否比str2小
str1 > str2 检查str1是否比str2大
-n str1 检查str1的长度是否非0
-z str1 检查str1的长度是否0
-o 或 相当于 ||
-a 和 相当于 &&

>
-n

文件比较

-d file 检查file是否存在并是一个目录
-f file 检查file是否存在并是一个文件
-e file 检查file是否存在
-s file 检查file是否存在并非空
-r file 检查file是否存在并可读
-w file 检查file是否存在并可写
-x file 检查file是否存在并可执行
-O file 检查file是否存在并属当前用户所有
-G file 检查file是否存在并且默认组与当前用户相同
file1 -nt file2 检查file1是否比file2新
file1 -ot file2 检查file1是否比file2旧

复合条件测试

if-then语句允许你使用布尔逻辑来组合测试。有两种布尔运算符可用:
 [ condition1 ] && [ condition2 ]
 [ condition1 ] || [ condition2 ]

用于数学表达式的双括号

双括号:比较过程中使用高级数学表达式
val++ 后增
val-- 后减
++val 先增
--val 先减
! 逻辑求反
~ 位求反
** 幂运算
<< 左位移
/>> 右位移
& 位布尔和
| 位布尔或
&& 逻辑和
|| 逻辑或
== 匹配字符

用于高级字符串处理功能的双方括号

双方括号:针对字符串比较的高级特性
采用的标准字符串比较,具有模式匹配

结构

case

变量和模式是匹配的
通过竖线操作符在一行中分隔出多个模式模式:Y|y
* 会捕获所有与已知模式不匹配的值

shift 移动变量

操作命令行参数
根据它们的相对位置来移动命令行参数
默认情况下它会将每个参数变量向左移动一个位置
即变量3的值会移到2中,变量2的值会移到1中,而变量$1的值则会被删除

#!/bin/bash
echo "The original:$*"
shift 2 #移动两个位置
echo "The position $1"

双破折线

双破折线表示选项列表结束。在双破折线之后脚本就可以放心地将剩下的命令行参数当作参数,而不是选项来处理了

#!/bin/bash
while [ -n "$1" ]
do
        case "$1" in
                -a) echo "Found the -a option" ;;
                -b) echo "Found the -b option";;
                -c) echo "Found the -c option" ;;
                --) shift
                break ;;
                *) echo "$1 is not an option";;
        esac
shift
done
#
count=1
for param in $@
do
        echo "Parameter #$count: $param"
        count=$[ $count + 1 ]
done

#!/bin/bash
while [ -n "$1" ]
do
case "$1" in
a) echo "print a";;
b) echo "print b";;
--) shift
    break;;
*) echo "$1 is not an option";;
esac
shift
done

count=1
for param in $@
do
echo "param #$count: $param"
count=$[ $count + 1 ]
done

在遇到双破折线时,脚本用break命令来跳出while循环。由于过早地跳出了循环,我们需
要再加一条shift命令来将双破折线移出参数变量

for

for var in list(遍历自身定义一系列值)
do
commands
done

处理循环的输出

!/bin/bash

for (( a=1;a<10;a++ ))
do
echo "The number is $a"
done > wu.txt
对循环的输出使用管道或进行重定向到文件中

更改字段分隔符

bash shell默认
空格
制表符
换行符
为分隔符
IF=$ 可以制定分隔符
IF=\ $’\n’ ,只有\n为分隔符

c语言for

for (( i = 1; i <= 10; i++ ))
do
command
done

while

while command

设置单个命令

只要测试条件成立, while命令就会不停地循环执行定义好的命令
测试条件中用到的变量必须修改,否则就会陷入无限循环

设置多个命令

只有最后一个测试命令的退出状态码会被用来决定什么时候结束循环

until

untile test commands
do
other commands
done

until条件成立则不执行,条件不成立则执行与 while 相反

设置单个命令

设置多个命令

控制循环

break

退出任意类型的循环
跳出当前正在执行的循环,完全终止整个循环

break n
n指定了要跳出的循环层级

continue

continue命令可以提前中止某次循环中的命令但并不会完全终止整个循环。
跳过此次循环中剩余的命令,但整个循环还会继续。
可以在循环内部设置shell不执行命令的条件。

continue n

实例

查找可执行文件

1.png

这个脚本使用了两个不同的IFS值来解析数据。第一个IFS值解析出/etc/passwd文件中的单独
的行。内部for循环接着将IFS的值修改为冒号,允许你从/etc/passwd的行中解析出单独的值。

处理用户输入

$0 表示程序名本身

在第9个变量之后,你必须在变量数字周围加上花括号,比如/${10}

解决变量$0不显示就会使用整个路径。

#!/bin/bash
name=$(basename $0)
echo The script name is:$name
echo This is $0                

$# 参数统计

判断命令行上有多少参数
echo there were $#

抓取所有的数据

$*  将这些参数视为一个整体
$@   参数当作同一字符串中的多个独立的单词

#!/bin/bash
count=1 
for param in "$*"
do
  echo "\$* is #$count=$param"
  count=$[ $count + 1 ]
done

for param in "$@"
do
  echo "\$@ is #$count=$param"
  count=$[ $count + 1 ]
done

${!#}

没有任何参数时, $#的值为0,
${!#}变量会返回命令行用到的脚本名
带参数时,显示数量相当于 !#

#!/bin/bash
num=$#
echo The num is $num
echo The "!#" is ${!#}
带参数时,显示数量

没带参数时,显示脚本名

$$ $?

显示当前进程
上个命令的退出状态

函数

创建函数

有两种格式

function name {
commands
}


name() {
commands
}
name函数的唯一名称,若定义名字一样则后续会替换第一个
commands函数中出现的顺序依次执行
注:
name 和 { 要有空格,否则出错

#!/bin/bash 
function wu {
 echo  "This my first function"
}

count=1
while [ $count -le 3 ]
do
  wu
  count=$[ $count + 1 ]
done
wu
function wu {
  echo $[ $1 * $2 ]
}

if [ $# -eq 2 ];then
  value=$(wu $1 $2)
  echo "The result is $value"
else
 echo "uage:file a b"
fi

前面的$1h和$2和脚本主体中的$1和$2变量并不相同
要在函数中使用这些值,必须在调用函数时手动将它们传过去。

return

函数的退出状态码是函数中最后一条命令返回的退出状态码:$?
但是无法知道其他命令中是否成功运行
return命令来退出函数并返回特定的退出状态码(整数值0~255,大于则会出错)

function wu {
read -p "Enter a value: " value
return $[ $value * 2 ]
}
注意:
函数一结束就取返回值
退出状态码必须是0~255

break

退出函数并返回特定的退出状态码
跳出循环体,该循环体已结束

contiune

中断循环中的迭代,若有指定的条件则继续循环下一个迭代
循环没有结束

局部变量

函数内部使用的任何变量都可以被声明成局部变量
局部变量:在变量声明的前面加上local关键

function wu {
 local temp=$[ $value + 5 ]
 result=$[ $temp * 2 ]
}
temp=4
value=6

wu
echo "The result is $result"
if [ $temp -gt $value ];then
echo "temp is larger"
else
echo "temp is smaller"
fi

数组

如果你试图将该数组变量作为函数参数,函数只会取数组变量的第一个值。
将该数组变量的值分解成单个的值,然后将这些值作为函数参数使用。
在函数内部,可以将所有的参数重新组合成一个新的变量。

#!/bin/bash
function testit {[图片上传中...(5.png-438497-1538820881421-0)]

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

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,364评论 0 5
  • 背景 之前写了系列的shell实战的文章,得到了挺多小伙伴的关注,遇到有些对shell不太熟悉小伙伴,所以有个想法...
    aron1992阅读 821评论 1 1
  • 你有没有过这样的经历? 某些你偶尔听说或闻所未闻的东西,在你使用之后,极大地提升了你的生活质量! 对于这类物品,江...
    LaViedeShan阅读 1,789评论 4 6
  • 需求:后台返回一个字符串"已经连续12天签到", 字符串中的数字要设置粗体&红色. 代码: 同样, 小数也是可以的...
    粒粒皇阅读 1,994评论 0 0
  • 文/纳苏。 关于他们的一切。 我深知,却又一无所知。 我们这些在文字里侥幸存活下来的陌生人,都成了臆想症患者。 也...
    纳苏阅读 387评论 3 5