shell 学习

帮助文档打开

  1. man
shang$ man ls
  1. --help
shang$ ls --help
  1. whatis
shang$ whatis ls

重定向

I/O重定向可以重新定义标准输出内容发送到哪里。

  1. 重定向操作符“>”,把标准输出定向到一个新的文件。当出现错误时,ls 程序不会把错误信息发送到标准输出文件中,会把错误信息发送到标准错误文件。
  2. 重定向符“>>”,将输出内容添加到文件末尾,若文件不存在,会创建一个。
  3. 标准错误输出。
    标准输入文件 0>;
    标准输出文件 1>;
    标准错误文件 2>;
shang$ ls -l /bin/usr 2> ls-error.txt
#错误和输出都放到文件中
shang$ ls -l /bin/usr > ls-output.txt 2>&1
#同上
shang$ ls -l /bin/usr &> ls-output.txt 
  1. /dev/null 。 bit bucket
  2. 标准输入重定向
    cat :读取一个或多个文件,并复制到标准输出文件中。
    “<” 重定向符,将标准输入的键盘源,改变为 符号后面的文件
shang$ cat < lazy_dog.txt
  This is a lazy dog.
  1. 管道
    命令从标准输入到读取数据,并将数据发送到标准输出的能力,是使用了名为管道的shell 特性。使用管道操作符 “|” 可以把一个命令的标准输出传送到另一个命令的标准输入中。
# less 命令可以分页显示任意命令的输入,将它的结果发送到标准输出。
shang$ ls -l/usr/bin | less
# 将 usr/bin 和 /bin 文件下所有的可执行程序合并成一个列表,安装顺序排序,最后查看这个吧列表。
shang$ ls -l/usr/bin /bin |sort | less
  1. wc
    统计文件中包含的 行数,字数 ,字节数。
    8.部分打印
shang$ head -n 5 ls-output.txt

shang$ tail -n 5 ls-output.txt
  1. $ cd dirname $0 和PWD%/* shell变量的一些特殊用法
    在命令行状态下单纯执行 $ cd dirname $0 是毫无意义的。因为他返回当前路径的"."。
    这个命令写在脚本文件里才有作用,他返回这个脚本文件放置的目录,并可以根据这个目录来定位所要运行程序的相对位置(绝对位置除外)。
    在/home/admin/test/下新建test.sh内容如下:
cd `dirname $0`
echo `pwd`

然后返回到/home/admin/执行

 shang$ sh test/test.sh

运行结果:

/home/admin/test

这样就可以知道一些和脚本一起部署的文件的位置了,只要知道相对位置就可以根据这个目录来定位,而可以不用关心绝对位置。这样脚本的可移植性就提高了,扔到任何一台服务器,(如果是部署脚本)都可以执行。
BASH使用基础

关于命令及命令类型

对于使用的命令BASH使用hash表,以加速下次的查找,为添加一个经常使用的命令,可以使用hash cmd
BASH在执行命令时对路径中找到的同名命令按以下的类型顺序执行:别名 keywords 函数 内置命令 可执行文件或脚本
BASH在执行用户输入的一条指令时,首先要判断命令的类型,可以使用type cmd来查看cmd是类型。
enable命令用来决定是否开启某个内置的命令,可以用enable -n cmd来禁用某个内置命令。
command命令用来消除别名和函数的查找。
builtin命令将只查找内置命令,而忽略函数和可执行文件。

作业控制:jobs %1 fg bg kill stop等
别名:alias dir='dir -l' unalisa dir
操作目录栈:dirs pushd popd
文件名替换:dir d[1-3] ls .bash{rc,profile} 支持[]对数字及{}对字符串的集合

变量 变量声明:declare -a 数组 -f 函数 -i 整数 -r 只读 -x 导出变量
本地变量只在其所声明的shell中有效,只读变量不能被修改,除非重新声明其属性
常见的环境变量:
BASH_VERSION DIRSTACK EUID EDITOR GROUPS HISTFILE HISTSIZE HOME LANG PWD OLDPWD PATH
PPID PS1-4 RANDOM SHELL UID
export var = value -f 导出的变量为函数 -n 将全局转为局部变量 -p只打印导出的变量
非只读变量可以通过unset清除、

变量替换
${var:-word} 如果变量var已经设置且非空,结果为var的值,否则结果为word
${var:=word} 如果变量var已经设置且非空,结果为var的值,否则设置var为word
${var:+word} 如果变量var已经设置且非空,则设置var的值为word;否则不替换
${var:?word} 如果变量var已经设置且非空,则替换为word,否则退出shell。
${var:n} 替换为从n开始的子串
${var:n:len} 替换为从n开始长len的子串
变量扩展

${var%pattern} 去掉最小匹配的后缀 echo ${PWD%/} 显示当前的父目录路径
${var%%pattern} 去掉最大匹配的后缀
${var#pattern} 去掉最小匹配的前缀
${var##pattern} 去掉最大匹配的前缀 echo ${PWD##
/} 显示当前目录名称
${#var} 替换为变量字符个数
特殊变量
$ 当前SHELL的PID
? 前一个命令的退出状态
! 后台执行的上一个工作的PID

读取用户输入
read 从终端读取输入存入内置变量REPLY
read var 从终端读取输入存入变量var
read first .. last 从终端读取多个变量依次存入,若输入较多,则最后一个变量成为包含多个值的字串
read -a array 从终端读取多个值存入数组中
read -p pmtstring var 向终端输出提示串,然后读入输入到var中
read -r line 读取一行,并允许/

变量类型转换
如果变量在声明时没确定类型,则变量根据赋值情况可以动态转换类型,但如果声明时变量类型已经确定,若赋值为其他类型,将导致原有数据丢失或出错。除非重新声明类型。
对于整数类型的变量,则在命令行支持算法扩展,如num=3*4,支持"",不支持空格。
进制

var=16#abc   var为16进制数abc

输出

printf "The number is %.2f/n" 100
echo -ne "hello/nworld/n"  -e 表示需要解析转义字符,-n 表示不自动添加换行符

位置参数
$0 1-0 ${10}
$# 求值位置参数个数
$* 求值所有位置参数
"$*"
$@
"$@"

引用
() 命令组,创建子SHELL执行
{} 命令组,不创建子SHELL
' ' 保护所有的元字符不被解析,想打印',必须放在双引号内,或者使用/转义
" " 只允许变量和命令替换,保护其余的元字符不被解析

命令替换

`cmd`
$(cmd)

二者结果都是一个字符串,如果加"",则保留换行,否则丢失换行。

数学表达式扩展 $[ exp ]
$(( exp ))

数组

declare -a array=(item1 item2 ...)
数组元素的引用 ${array[i]}
引用整个数组 ${array[*]}
unset array

函数定义

function f()
{
cmd;cmd;
}

I/O重定向

find . name /*.c print > foundit 2>&1

命令行参数

set可用来设置位置参数,使用set --将清除所有位置参数
$与$@的区别只在于" "时,当$放在""内时,参数表成为单个字符串,而$@放在""内时,每个参数都被引号括住。

表达式

评估表达式

expr $[3+4] $[ 3+4 ] $(( 3+4 ))

let算术扩展
let i=i+1 支持任何C类型的运算符,但只支持整形数运算
bash不支持小数运行,因此需要在bc或者awk中进行相应的运行,再把结果回。由于bash没有浮点型,所以小数是以字符串表示。

测试表达式
测试可以使用test或者单纯的[ expr1 cmp expr2],结果保存于?变量中,即test与[]等价
字符串测试
[ str1 = str2 ] str1与str2相同或==
[ str1 != str2 ] st1与str2不相同
[ str ] str非空
[ -z str ] str的长度为0
[ -n str ] str的长度非0
[ -l str ] str的长度
[ str1 -a str2 ] and
-o or
! not
复合条件测试
[[ p1 && p2 ]] p1与p2均为真
[[ p1 || p2 ]]
[[ !p2 ]]
整数测试
[ num1 -eq num2 ]
[ numb1 -ne num2 ]
gt ge lt le
文件属性测试
[ file1 nt file2 ] 文件1比文件2新
[ file1 ot file2 ]
[ file1 ef file2 ]
[-d file] file为目录
-b -c -p -L -S 块文件,字符文件,管道,链接,socket
-e -f 文件存在,常规文件
-G 文件存在且拥有有效GID
-O 文件存在且拥有有效UID
-g 设置GID
-k 设置stick位
-r -w -x 文件可读,可写,可执行的
-s 文件大小非0
-t 文件fd在终端打开
-u setUID位设置

测试表达可以与let的运算扩展及(( ))中的C型运算扩展是等价的,后者也许更容易理解,C-like。

条件控制
if command
then
command
command
fi

if test expression
then
command
fi

if [ string/numeric expression ] then
command
fi

if [[ string expression ]] then
command
fi

if (( numeric expression ))

if command
then
command(s)
else
command(s)
fi

if command
then
command(s)
elif command
then
commands(s)
elif command
then
command(s)
else
command(s)
fi

空命令 :

分支跳转
case variable in
value1)
command(s)
;;
value2)
command(s)
;;
*)
command(s)
;;
esac

循环 for variable in word_list
do
command(s)
done

while condition
do
command(s)
done

until command
do
command(s)
done

构建菜单的select select program in 'ls -F' pwd date
do
$program
done

中断循环 break [n] 从第n层循环中跳出
continue [n] 继续第n层循环

捕获信号
信号列表

  1. SIGHUP 9) SIGKILL 17) SIGCHLD 25) SIGXFSZ
  2. SIGINT 10) SIGUSR1 18) SIGCONT 26) SIGVTALRM
  3. SIGQUIT 11) SIGSEGV 19) SIGSTOP 27) SIGPROF
  4. SIGILL 12) SIGUSR2 20) SIGTSTP 28) SIGWINCH
  5. SIGTRAP 13) SIGPIPE 21) SIGTTIN 29) SIGIO
  6. SIGABRT 14) SIGALRM 22) SIGTTOU 30) SIGPWR
  7. SIGBUS 15) SIGTERM 23) SIGURG
  8. SIGFPE 16) SIGSTKFLT 24) SIGXCPU
    trap 'command; command' signal-number-list
    trap 'command; command' signal-name-list 处理信号,当收到singal-list中的信号后,执行 ''中的命令
    trap singal 重置信号处理函数
    trap 列出已经设置信号处理

调试脚本
bash -x script 显示命令执行过程,及结果
bash -v script 显示脚本中的各行
bash -n script 解释但不执行

常用命令
script myfile 将终端交互信息保存在myfile中,使用control+d退出
fuser -n tcp 22 获得打开tcp 22的进程
lsof 获得进程打开的文件

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

推荐阅读更多精彩内容

  • 绝对路径 绝对路径开始于根目录,紧跟着目录树的一个个分支,一直到所期望的目录或文件。例子:/home/alex意味...
    云彩上的翅胖阅读 287评论 0 0
  • 基础 头文件 #!/bin/bash 或者#!/bin/sh #!约定的标记,如IOS的Import 执行文件时需...
    ZMJun阅读 1,222评论 1 2
  • [TOC] Shell基本介绍 shell学习必备基础 Linux的基本使用 如何在bash上执行程序 简单的管道...
    J书越来越垃圾了阅读 1,301评论 0 4
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,561评论 18 139
  • 在人人读书的时代,听书变的些许稀罕。 然而每天晚上和中午听书成了催眠曲 龙哥的读书会还是不错的,每次听不到10分钟...
    靜逅花開阅读 274评论 0 0