ShellScript小试牛刀

《LinuxShell脚本攻略》笔记,Chap-1:小试牛刀



简介

#bash(Bourne Again Shell),shell环境使得用户能与操作系统的内核进行交互操作

#!/bin/bash
#date
#description

cmd1; cmd2
cmd3

#sh /path/xx.sh
#Bash还有一个历史记录文件 ~/.bash_history


终端打印

#终端作为交互式工具,用户可以通过它与shell环境进行交互

echo '$var'
echo $var
echo -e "1\t2\t3"
echo -e '\e[1;31m Red color \e[0m'    #彩色

echo {1..10}        #输出1到10
echo {A..H}     #for i in {a..z}

cat << EOF
11
22
33
EOF

# \转义字符
printf "%-5s %-10s $-4.2f\n" 001 Zhang 56.789
#格式替代符%s %d %c %f, -左对齐


玩转变量和环境变量

#Bash中,每一个变量默认值值都是字符串形式
#环境变量和自定义变量

echo $SHELL
echo $UID

var=value   #这是赋值
#var = value这是相等操作
echo $var
echo ${var}
echo ${#var}    #字符数

#export用来设置环境变量,此后,任何shell中的程序都会继承环境变量
ZHANG=Gentleman
export ZHANG

PATH="$PATH:/home/zhang/bin"
export $PATH


通过shell进行数学运算

#let, expr, bc, [], (())
#要注意默认是字符串类型哦

n1=1;n2=2
let sum=n1+n2
let n1++;let n2-=1

sum=$[ n1 + n2 ]
sum2=$(( sum + 3 ))

sum=`expr 3 + 4`

#浮点计算 bc
echo "8 * 1.1" | bc

#设置小数点精度
echo "scale=2; 3/8" | bc

#进制转换
num=100
echo "obase=2; $num" | bc

num=1100100
echo "obase=10; ibase=2; $num" | bc

#平方和平方根
echo "sqrt(100)" | bc
echo "10^2" | bc


文件描述符重定向

#最常用的文件描述符是 stdin(0), stdout(1), stderr(2); 通过内容过滤将输出重定向到文件

echo "This is a sample text 1" > temp.txt   #覆盖
echo "This is sample text 2" >> temp.txt    #追加

ls + >stdout.txt 2>stderr.txt
cmd 2>&1 /dev/null  == com &> /dev/null     #null设备也被称为黑洞

#当一个command发生错误并退回时,它会返回一个非0的状态码
echo $?

#tee命令,一方面可将数据重定向到文件,另一方面还可提供一份重定向数据的副本作为后续命令的stdin
#tee默认覆盖文件,-a选项追加
cat temp.txt | tee tee.txt | cat -n


数组和关联数组

#数组借助索引将多个独立的数据存储为一个集合
#普通数组只能使用整数作为数组索引,而关联数组可以使用字符串作为数组索引
#还可将数组定义成一组索引-值(index-value)

arr=(1 two 3 four 5)
echo ${arr[0]}
arr[0]=One

index=3
echo ${arr[$index]      #arr[3]
echo ${arr[*]}
echo ${#arr[*]}     #arr-length

#关联数组可用任意文本作为数组索引
declare -A ass_arr
ass_arr=([index1]=val1 [index2]=val2 ...)   #内嵌索引-值
ass_arr[index3]=val3    #独立索引-值
echo ${!ass_arr[*]}     #列出数组索引


别名

#alias作用是暂时的,关闭终端后别名就失效;
#为使别名一直保持,可将其写入 ~/.bashrc,因为每一个新的shell都会执行~/.bashrc中的命令
#新设置的别名将取代已有别名

alias vi=vim; unalias vi
echo "alias ll='ls -l --color=auto'" >> ~/.bashrc

#\对别名命令进行转义,执行原本的命令。避免攻击者利用别名将某些特权命令替换成别有用心的命令
\vi test.sh


获取、设置日期和延时

#很多应用程序需要以不同的格式打印日期,设置日期和时间,以及根据日期和时间执行操作;
#延时通常用于在程序执行过程中提供一段等待时间;
#在Unix-like系统中,日期被存储为一个整数,其大小为世界标准时间1970年1月1日0时0分0秒起所流逝的秒数;
#这种计时方式被称之为 纪元时或Unix时间;
#通过纪元时间,可知道两个日期之间相隔了多少秒
#编写以循环方式运行的监视脚本时,设置时间间隔是必不可少的

date +%s

#!/bin/bash
start=$(date +%s)
commands
sleep 1
end=$(date +%s)
diff=$((end - start))
echo "$diff seconds"


调试脚本

#调试功能能在出现一些异常情况时生成运行信息

#!/bin/bash -xv
sh -x
sh -n


函数和参数

function fname()
{
statements
}


fname()
{
echo $1, $2     #访问第参数1和参数2,$n第n个参数
echo "$@"       #以列表的形式一次性打印所有参数
echo "$*"       #类似于$@,但参数被作为单个实体
return 0        #f返回值
}
fname 1 22 333  #返回上面定义的变量


#递归函数,能够调用自身,不断地生成新的进程,最终会造成xx
#导出函数,使用export导出,这样函数作用域就可以扩展到子进程
export -f fname
#读取命令返回值
echo $?


读取命令序列输出

#输入通常是stdin,输出stderr或stdout,这些命令称为 过滤器(filter)。我们使用 管道(pipe) 来连接每一个过滤器
cmd1 | cmd2 | cmd3

#子shell,子shell生成独立的进程,不会对当前shell有任何影响,所做改变仅限于子shell内
zhang=$(ls | cat -n)
#反引用
zhang=`ls | cat -n`


读取字符

#read是一个重要的从标准输入中读取文本的命令
#可以使用read以交互的形式来读取用户的输入

read -n 5 zhang     #读取字符数
echo $zhang

read -s passwd      #不回显
echo $passwd

read -t 5 zhang     #超时时间
echo $zhang

read -p zhang       #显示提示信息
echo $zhang

read -d ":" zhang       #定界符结束输入
123:
echo $zhang


字段分隔符和迭代器

#内部字段分隔符(Internal Field Separator, IFS)是shell中的一个重要概念
#IFS的默认值为空白字符(换行符、制表符、空格)
awk -F: '{print $1,$3}' /etc/passwd     #IFS=":"

#对一些列值进行迭代,循环非常有用
for i in {1..10}
do
cmd
done

while condition
do
cmd
done

until condition
do
cmd
done


比较与测试

#程序中的流程控制是由比较和测试语句来处理的
if condition1 || condition2
then
    cmd1
elif condition3 && condition4
then
    cmd2
else
    cmd3
fi

#算术比较
if [ $num -ge 10 -a $num -lt 20 ]

-eq
-gt
-ge
-lt
-le
-a
-o

#文件系统相关
if [ -f $file1 -o -x $file2]

-x
-w
-r
-f
-d
-e
-b      #block
-l

#字符串比较
[[ $str1 = $str2]]

=       #=号旁有空格--是比较关系;=号旁没空格,是赋值语句
!=
>
<
-z      #空字符
-n      #非空字符

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

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,802评论 6 13
  • 基础命令 主要的命令和快捷键 Linux系统命令由三部分组成:cmd + [options]+[operation...
    485b1aca799e阅读 1,079评论 0 0
  • Shell 快速指南 概述 什么是 shell Shell 是一个用 C 语言编写的程序,它是用户使用 Linux...
    静默虚空阅读 696评论 0 5
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,074评论 25 707
  • 面对众人很紧张,热闹的地方很孤单。原本准备了充分的材料,在脑子里演练过自如的表达自信的谈吐眼神的交流。但是,...
    Redchen阅读 211评论 0 0