Shell基本操作(1)

一、变量与环境变量

  1. 获得字符串的长度
var=hello,world!
echo ${#var}
12
  1. 识别当前使用的 SHELL
echo $SHELL

或者

echo $0
  1. 检查是否为超级用户
if [ $UID -ne 0 ]; then
    echo "Non root user.Please run as root."
else
    echo "Root user."
fi

root 用户的 UID 等于0

注意

echo + 双引号和单引号的区别

单引号是原样输出,引号中的参数引用无效。
双引号会输出引号中的参数。

二、算术运算

整型计算

  1. let

let 可以直接支持基本算术操作

let a=b*c
let a++
let a--
let a+=1
let a-=1
  1. [ ] 操作符
a=$[ b + c ]
或
a=$[ $b + $c ]
  1. (( )) 操作符
a=$(( b + c ))
或
a=$(( $b + $c ))
  1. expr
a=`expr $b + $c`
或
a=$(expr $b + $c)

浮点计算

  1. bc

bc 是一个用于数学计算的高级工具

基本使用

a=`echo "$b * $c" | bc`

设置小数精度

# 设置小数位为2
a=`echo "scale=2;$b * $c" | bc`

进制转换

a=100
echo "obase=2;$a" | bc
1100100

b=1100100
echo "obase=2;ibase=2;$b" | bc
100

平方和开平方

echo "sqrt(100)" | bc
echo "10^10" | bc

三、文件描述符与重定向

文件描述符是与某个打开的文件或数据流相关联的整数,是一种用户访问文件的抽象指示器。

  • 0 stdin 标准输入
  • 1 stdout 标准输出
  • 2 stderr 标准错误

将标准输出和标准错误重定向到文件

command 1>stdout.log 2>stderr.log

将标准错误转换成标准输出,并重定向到文件

command 2>&1 file.log
或
command &> file.log

将标准输出 stdout 写入文件并且将副本作为后续命令标准输入

command | tee file.log | command

自定义文件描述符

0,1和2是stdin、stdout和stderr的预留描述符编号,我们可以使用exec命令创建自定义的文件描述符。

创建一个文件描述符

echo hello,world! > file
exec 3<file
cat <&3
hello,world!

同理

exec 4>file
echo hello,world! >&4
cat file
hello,world!

exec 4>>file
echo hello,world! >&4
cat file
hello,world!hello,world!

注意,如果要再次读取和写入,需要用exec重新分配文件描述符后才能使用。

四、数组和关联数组

数组

  • 定义数组
arr=(a b c)
或者
arr[0]="a"
arr[1]="b"
arr[2]="c"
  • 打印数组
echo ${arr[0]}
a

index=2
echo ${arr[$index]}
c

echo ${arr[*]} # 打印数组列表
a b c

echo ${arr[@]} # 打印数组列表
a b c
  • 打印数组长度
echo ${#arr}

关联数组

  • 声明并定义关联数组
declare -A ass_arr # 声明关联数组

ass_arr=([key1]=value1 [key2]=value2 [key3]=value3)
或者
ass_arr[key1]=value1
ass_arr[key2]=value2
ass_arr[key3]=value3
  • 打印关联数组
echo "The string is $ass_arr[key1]"
The string is value1
  • 列出关联数组所有索引
echo ${!ass_arr[*]}
或者
echo ${!ass_arr[@]}

五、函数和参数

  • 定义函数
function function_name()
{
    ...
}
或者
function_name()
{
    ...
}
  • 参数
fucntion function_name()
{
    echo $0, $1, $2; # 脚本名 参数1 参数2
    echo $@; # 以列表的方式一次性打印所有参数
    echo $*; # 类似 $@ 但是参数被作为单个字符串,很少使用
    return 0; # 返回值
}

六、命令输出写入变量

var=$(COMMANDS)
或者
var=`COMMANDS`

使用双引号可以保留空格和换行符(\n)

cat file
1
2
3

var=$(cat file)
1 2 3

var="$(cat file)"
1
2
3

七、标准输入

通过read命令,从键盘或者标准输入中读取文本。

八、运行命令直至执行成功

  • 定义一个函数
repeat()
{
    while true
    do
        $@ && return
    done
}
或
repeat() { while true; $@ && return; done }
  • 一种更快的方法

":"命令是 Shell 内建的命令,它总是会返回0的退出码。而 true 是作为 /bin 中的一个二进制文件实现的,意味着每次 while 循环都会生成一个进程。

repeat()
{
    while :
    do
        $@ && return
    done
}
或
repeat() { while :; $@ && return; done }
  • 增加延时
repeat()
{
    while :
    do
        $@ && return
        sleep 20 # 休眠20秒
    done
}
或
repeat() { while :; $@ && return; sleep 20; done }

九、内部字段分隔符

内部字段分隔符(internal Field Separator, IFS)

  • 实际演示
oldIFS=$IFS # 备份旧的IFS
IFS=","
for item in $items;
do
    echo item: $item
done
IFS=$oldIFS

十、循环

  • for
for item in items;
do
    commands;
done
或
for((i=0; i<10; i++))
{
    commands;
}
  • while
while condition
do
    commands;
done
  • until
until condition
do
    commands;
done

十一、判断

  • if
if condition;
then
    commands;
fi
  • else if
if condition;
then
    commands;
else if condition; then
    commands;
else
    commands;
fi
  • 算数比较

单条件判断

[ $var -eq 0 ]
[ $var -ne 0 ]

多条件判断

[ $var -ne 0 -a $var -gt 2 ] # -a表示逻辑与
[ $var -ne 0 -o $var -gt 2 ] # -o表示逻辑或
  • 文件系统测试
指令 含义
[ -f $var ] 判断文件路径或者文件名是否正确
[ -x $var ] 判断文件是否可执行
[ -w $var ] 判断文件是否可写
[ -r $var ] 判断文件是否可读
[ -d $var ] 判断是否为文件夹
[ -e $var ] 判断文件是否存在
[ -c $var ] 判断是否为一个字符设备文件的路径
[ -b $var ] 判断是否为一个块设备文件的路径
[ -L $var ] 判断是否为一个符号链接
  • 字符串比较

使用字符串比较时,最好用双中括号 [[ ... ]],因为有时候采用单中括号会产生错误,最好避开它们。

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

推荐阅读更多精彩内容

  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,149评论 2 34
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,934评论 6 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,637评论 18 139
  • 春天三月桃花运 艳阳高照大白云 姑娘脸蛋染红晕 桃花朵朵粉红韵 小伙羞羞交大运 赶紧米酒来酿酝 上门求亲好应允 低...
    罗嗦小窝_tpw_698阅读 340评论 0 0
  • 红翡 红翡绿翠,红色的翡翠称为翡。大家都知道,翡翠是一种多色玉石,红、黄、绿、紫、白、青等等,我们平常见的最多是绿...
    珠宝大课堂阅读 1,164评论 0 0