shell 基础速查

shell 基础速查


变量与局部变量

变量的定义

a=12
a=helloword
a=`pwd`
a=$a:a

局部变量

local a=12

取消变量

unset a

生成环境变量

export

特殊变量

位置变量

$0:	# 获取当前执行shell脚本的文件名,还包括路径。
$n:	# 获取当前执行脚本的第n个参数,n=1...9,如果n大于9,则需要将n使用大括号括起来;
$*:	# 获取当前shell的所有参数,将所有命令行参数视为单个字符串,相当于“$1$2$3”;
$#:	# 得到执行当前脚本的参数个数;
$@:	# 获取最高程序所有参数,并保留参数之间的任何空白,相当于“$1” “$2” “$3”,这是将参数传给其他程序的最好办法

状态变量

$?:	# 判断上一指令是否成功执行,0为成功,非零为不成功
$$:	# 去当前进程的pid
$!:	# 上一个指令的pid

变量-参数展开

${parameter:-word}	# 如果变量未定义,则表达式的值为word。
${parameter:=word}	# 如果变量未定义,则设置变量的值为word,返回表达式的值也是word。
${parameter:?word}	# 用于捕捉由于未定义而导致的错误并推出程序。
${parameter:+word}	# 如果变量已经定义,返回word,也就是真。
${!prefix*}
${!prefix@} 		# prefix开头的变量

字符串展开

${#parameter}					# 输出字符长的长度
${parameter:offset}				# 从第offset字符开始截取
${parameter:offset:length}		# 从offset字符开始截取,取length长度
${parameter#pattern}			# 从头删除最短匹配
${parameter##pattern}			# 最长
${parameter%pattern}			# 从尾删除最短
${parameter%%pattern}			# 从尾删除最长
${parameter/pattern/string} 	# 第一个匹配被替换
${parameter//pattern/string}	# 全部匹配被替换
${parameter/#pattern/string}	# 字符串开头的替换
${parameter/%pattern/string}	# 字符串结尾的替换
${parameter..} ${parameter^^}	# 全部转换为小写、大写
${parameter,} ${parameter^}		# 首字母转换为小写、大写

变量的删除-取代-替换

变量设置方式str没有设置str为空字符串str已设置为非空字符串
var=${str-expr}var=exprvar=var=$str
var=${str:-expr}var=exprvar=exprvar=$str
var=${str+expr}var=var=exprvar=expr
var=${str:+expr}var=var=var=expr
var=${str=expr}str=expr ; var=exprstr不变 ; var=str不变 ;var=$str
var=${str:=expr}str=expr ; var=exprstr=expr ; exprstr不变 ; var=$str
var=${str?expr}expr 输出至 stderrvar=var=$str
var=${str:?expr}expr 输出至 stderrexpr 输出至 stderrvar=$str

限制命令-ulimit

ulimit [-SHacdflltu] [配额]

-H	# hard limit,严格的设置,必定不能超过这个设置的数值
-S	# soft limit,警告的设置,可以超过这个设置值,但是超过则有警告信息
-a	# 后面不接任何选项与参数,可列出所有的限制额度
-c	# 当某些程序发生错误时,系统可能将程序在内存中的信息写成文件
-f	# 此shell 可以建立的最大文件容量,
-d	# 程序可以用的最大段内存
-l	# 可用于锁定(lock)的内存量
-t	# 可使用的最大CPU时间
-u	# 单一使用者可以使用的最大进程数量

输入输出-read

read [-options] [variable]

-a array		# 把输入赋值到array中,从索引号零开始
-d delimiter	# 用字符串deliiter中的第一个字符指示输入结束,而不是一个换行符
-e				# 使用readline来处理输入。这使得与命令行相同的方式编辑输入
-n num			# 读取num个输入字符,而不是整行
-p prompt		# 为输入显示提示信息, 使用字符串prompt
-r				# Raw mode 不把反斜杠字符解释为转义字符
-s				# Silent mode寂寞模式
-t seconds		# 超时
-u fd			# 使用文件描述符fd中的输入,而不是标准输入

变量声明-declare

declare [-aixr] variable

-a	# 将后面名为 variable 的变量定义成为数组 (array) 类型
-i	# 将后面名为 variable 的变量定义成为整数 (integer) 类型
-x	# 用法与 export 一样,就是将后面的 variable 变成环境变量
-r	# 将变量设置成为 readonly 类型,该变量不可被更改内容,也不能 unset

输入输出-echo

echo string

echo -e "Hello HaiZei\n" # 开启转义
echo "Hello $name, This is HaiZei"
echo "\"Hello HaiZei\""

输入输出-printf

printf format-string [arguments...]

命令别名-alias

alias rm='rm -i'

历史命令-history

history [-option] histfiles

n	# 数字,意思是要列出最近的n条命令表的意思
-c	# 将目前的 shell 中的所有 history 内容全部清除
-a	# 将目前新增加的 history 命令新增入 histfiles 中,若没有加 histfiles,则默认写入~/bash history
-r	# 将 histfiles 的内容读到目前这个 shell 的 history 记录中
-w	# 将目前的 history 记录的内容写入 histfiles 中

函数定义

#!/bin/bash
function _printf_ {
	echo $1
	return 
}

_printf_() {
	echo $1
	return
}

逻辑判断

-b	# 如果文件存在并且是块特殊文件,则为True。
-c	# 如果文件存在且是字符特殊文件,则为True。
-d	# 如果文件存在并且是一个目录,则为。
-e	# 如果文件存在(无论类型),则文件为True。
-f	# 如果文件存在并且是常规文件,则为-f文件True。
-g	# 如果文件存在并设置了它的set group ID标志,则该文件为True。
-h	# 如果文件存在且是符号链接,则-h文件为真。保留此操作符是为了与此程序的以前版本兼容。不依赖它的存在;使用-l。
-k	# 文件为真,如果文件存在,并且它的粘性位被设置。
-n	# 如果字符串的长度非零,则为-n字符串True。
-p	# 如果文件是命名管道(FIFO),则为-p文件True。
-r	# 如果文件存在且可读,则为-r文件True。
-s	# 如果文件存在且大小大于零,则为-s文件True。
-t	# file_descriptor如果文件描述符编号为file_descriptor的文件打开并与终端关联,则为。
-u	# 如果文件存在并且设置了它的设置用户ID标志,则该文件为True。
-w	# 如果文件存在且可写,则w文件为真。True仅指示写标志处于打开状态。该文件甚至不能在只读文件系统上写入如果测试结果为真。
-x	# 如果文件存在且可执行,则该文件为True。True仅指示执行标志处于打开状态。如果file是一个目录,则true表示该文件可以搜索。
-z	# 如果字符串的长度为0,则-z字符串为真。
-L	# 如果文件存在并且是符号链接,则为。
-O	# 如果文件存在且其所有者与此进程的有效用户id匹配,则文件为True。
-G	# 如果文件存在且其组与此进程的有效组id匹配,则为-G文件True。
-S	# 如果文件存在且是套接字,则为-S文件True。

file1 -nt file2	# 如果file1存在并且比file2更新,则为True。

file1 -ot file2	# 如果file1存在且大于file2,则为True。

file1 -ef file2	# 如果file1和file2存在并引用同一文件,则为True。

string 		  # 如果字符串不是空字符串,则为True。
s1 = s2       # 如果字符串s1和s2相同,则s1 = s2为真。
s1 != s2      # 如果字符串s1和s2不相同,则s1 != s2为真。
s1 < s2       # 如果字符串s1根据字符的二进制值出现在s2之前,则s1 < s2为真。
s1 > s2       # 如果字符串s1根据字符的二进制值位于s2之后,则s1 > s2为真。
n1 -eq n2     # 如果整数n1和n2在代数上相等,则n1 -eq n2为真。
n1 -ne n2     # 如果整数n1和n2在代数上不相等,n1 -ne n2为真。
n1 -gt n2     # 如果整数n1在代数上大于整数n2,则n1 -gt n2为真。
n1 -ge n2     # 如果整数n1在代数上大于或等于整数n2,则n1 -ge n2为真。
n1 -lt n2     # 如果整数n1在代数上小于整数n2,那么n1 -lt ln2为真。
n1 -le n2	  # 如果整数n1在代数上小于或等于整数n2,那么n1 -le ln2为真。
expression1 -a expression2 # 如果表达式1和表达式2都为真,则为真。
expression1 -o expression2 # 如果表达式1或表达式2为真,则为真。
-a 运算符的优先级高于 -o 运算符。
任务:
find . -name "*.c" | xargs cat -n a | wc -l

流程控制-if

#!/bin/bash
if [[ condition ]]; then
	# statements
fi

if [[ condition ]]; then
	# statements
	else
	# statements
fi

if [[ condition ]]; then
	# statements
elif [[ condition ]]; then
	# statements
elif [[ condition ]]; then
	# statements
	else
	# statements
fi

流程控制-for

for i in `seq 1 100`; do
	# statements
	break
	continue
done

for (( i = 0; i < 10; i++ )); do
	# statements
done

流程控制-while

#!/bin/bash
while [[ condition ]]; do
	# statementd
done

流程控制-until

#!/bin/bash
until [[ conition ]]; do
	# statements
done

流程控制-case

#!/bin/bash
case word in
	pattern1 )
	程序段
		;;
	pattern2 )
	程序段
		;;
	*)
		exit 1
		;;
esac

数组声明

declare -a a

name[subscript]=value
name=[value1 value2 ...]

数组操作

输出数组内容

${arry[*]}
${arry[@]}

确定数组元素个数

${#arry[@]}

找到数组的下标

${!arry[@]}

数组追加

arry+=(a b c)

数组排序

sort

删除数组与元素

unset

基础正则表达式字符集合

RE字符意义
^word待查找的字符串(word)在行首
word$待查找的字符串(word)在行尾
.代表【一定有一个任意字符】的字符
\转义符,将特殊符号的特殊意义去除
*重复零个到无穷多个的前一个RE字符
[list]字符集合的RE字符,里面列出想要选取的字符
[n1-n2]字符集合的RE字符,里面列出想要选取的字符范围
[^list]字符集合的RE字符,里面列出不要的字符串或范围
{n,m}连续n到m个的【前一个RE字符】

三剑客-awk

用于处理一列字段

AWK是一种处理文本文件的语言,是一个强大的文本分析工具。

之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

awk [选项参数] 'script' var=value file(s)awk [选项参数] -f scriptfile var=value file(s)

-F fs or --field-separator fs
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
-v var=value or --asign var=value
赋值一个用户定义变量。
-f scripfile or --file scriptfile
从脚本文件中读取awk命令。
-mf nnn and -mr nnn
对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
-W compact or --compat, -W traditional or --traditional
在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。
-W copyleft or --copyleft, -W copyright or --copyright
打印简短的版权信息。
-W help or --help, -W usage or --usage
打印全部awk选项和每个选项的简短说明。
-W lint or --lint
打印不能向传统unix平台移植的结构的警告。
-W lint-old or --lint-old
打印关于不能向传统unix平台移植的结构的警告。
-W posix
打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。
-W re-interval or --re-inerval
允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]-W source program-text or --source program-text
使用program-text作为源代码,可与-f命令混用。
-W version or --version
打印bug报告信息的版本。

三剑客-grep

用于抓取对应字段的内容

grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。

grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]

-a--text : 不要忽略二进制的数据。
-A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
-b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
-B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
-c--count : 计算符合样式的列数。
-C<显示行数>--context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
-d <动作>--directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
-e<范本样式>--regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
-E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
-f<规则文件>--file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
-F 或 --fixed-regexp : 将样式视为固定字符串的列表。
-G 或 --basic-regexp : 将样式视为普通的表示法来使用。
-h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
-H 或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
-i 或 --ignore-case : 忽略字符大小写的差别。
-l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
-L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
-n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
-o 或 --only-matching : 只显示匹配PATTERN 部分。
-q 或 --quiet或--silent : 不显示任何信息。
-r--recursive : 此参数的效果和指定"-d recurse"参数相同。
-s 或 --no-messages : 不显示错误信息。
-v 或 --revert-match : 显示不包含匹配文本的所有行。
-V--version : 显示版本信息。
-w 或 --word-regexp : 只显示全字符合的列。
-x --line-regexp : 只显示全列符合的列。
-y : 此参数的效果和指定"-i"参数相同。

三剑客-sed

用于处理一行字段

Linux sed 命令是利用脚本来处理文本文件。

sed 可依照脚本的指令来处理、编辑文本文件。

sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。

sed [-nefr]
sed [-hnV][-e<script>][-f<script文件>][文本文件]
#参数说明:
-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
-f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
-h或--help 显示帮助。
-n或--quiet或--silent 仅显示script处理后的结果。
-V或--version 显示版本信息。
-r : sed的操作使用的是扩展型正则表达式的语法
#动作说明:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

shell获取字符串长度

有时在Linux操作系统中需要计算某个字符串的长度,通过查询资料整理了下目前Shell中获取字符串的长度的多种方法,在这里分享给大家,方法如下:
方法1: 使用wc -L命令
wc -L可以获取到当前行的长度,因此对于单独行的字符串可以用这个简单的方法获取,另外wc -l则是获取当前字符串内容的行数。

echo "abc" |wc -L

方法2: expr length string
使用expr length可以获取string的长度
方法3: awk获取域的个数,但是如果大于10个字符的长度时是否存在问题需要后面确认
复制代码 代码如下:

echo "abc" |awk -F "" '{print NF}'

方法4: 通过awk+length的方式获取字符串长度
复制代码 代码如下:

echo “Alex”|awk '{print length($0)}'

方法5: 通过echo ${#string}的方式(注意:这里的string是该字符串的变量名)
复制代码 代码如下:

name=Alex
echo ${#name}

测试命令-test

1.关于某个文件名的【文件类型】判断,如test -e filename 表示存在否

-e	# 该文件名是否存在 (常用)
-f	# 该文件名是否存在且为文件(file)(常用)
-d	# 该文件名是否存在且为目录(directory)(常用)
-b	# 该文件名是否存在且为一个 block device 设备
-c	# 该文件名是否存在且为一个 character device 设备
-S	# 该文件名是否存在且为一个 socket 文件
-p	# 该文件名是否存在且为一个FIFO (pipe)文件
-L	# 该文件名是否存在且为一个链接文件

2.关于文件的权限检测,如 test -r filename 表示可读否 (但root权限常有例外)

-r	# 检测文件名是否存在且具有【可读】的权限
-w	# 检测文件名是否存在且具有【可写】的权限
-x	# 检测文件名是否存在且具有【可执行】的权限
-u	# 检测文件名是否存在且具有【SUID】的属性
-g	# 检测文件名是否存在且具有【SGID】的属性
-k	# 检测文件名是否存在且具有【Sticky bt】的属性
-s	# 检测文件名是否存在且为【非空文件】

3.两个文件之间的比较,如:test file1 -nt file2

-nt	# (newer than) 判断 file1 是否比 file2 新
-ot	# (older than) 判断 file1 是否比 file2 旧
-ef	# 判断 file1 与 file2 是否为同一个文件,可用在判断 hard link 的判定上。主要意义在判定,两个文件是否均指向同一个文件

4.关于两个整数之间的判定,例如 test n1 - n2

-eq	# 两数值相等(equal)
-ne	# 两数值不相等(not equal)
-gt	# n1 大于 n2 (greater than)
-lt	# n1 小于 n2 (less than)
-ge	# n1 大于等于 n2 (greater than or equal)
-le	# n1 小于等于 n2 (less than or equal)

5.判定字符串的数据

test -z string		# 判定字符串是否为 0?若 string 为空字符串,则为true
test -n string		# 判定字符串是否非为 0?若 string 为空字符串,则为true
test str1 == str2	# 判定 str1 是否等于 str2,若相等,则为true
test str1 != str2	# 判定 str1 是否不等于 str2, 若相等,则返回false

6.多重条件判断,

-a	# (and) 两条件同时成立,
-o	# (or) 两条件任何一个成立。
!	# 反向状态。

判断符号-[]

在中括号内的每个组件都需要空格来分隔

在中括号内的变量,最好都以双引号括起来

子啊中括号中常数,最好都以单或双引号括起来

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值