shell-grammar
来源:互联网 发布:大数据与经济发展 编辑:程序博客网 时间:2024/06/12 21:53
- Shell运行环境
- 变量
- shell变量局部变量环境变量
- 整数
- 字符串
- 各种操作
- 数组
- 各种操作
- 参数
- 分支控制
- 死循环
- 函数
- 运算符
- test测试
- 输入输出
- 输入出重定向
此章节内容大部分请参考
Shell运行环境
登录到linux就有个登录shell
可以在此登录shell中执行语句,也可以执行shell脚本(开个子shell执行shell语句);
与环境有关系的指令:
- export var 在任何子shell中均有该变量的拷贝
子shell继承了父shell, 但子shell不能影响父shell的变量值;
- source var 当前shell 中执行命令;
变量
var=value #变量定义不能有空格; 变量的二次赋值不能用$var,直接用变量名则可。unset var #变量的删除#变量的使用()$var${var} #增加变量名边界的定位
shell变量、局部变量、环境变量
局部变量:当前shell实例可用的变量;
环境变量:所有的程序,包含shell启动的程序都能访问的变量;
Shell变量:前面两种的总称!
/etc/bashrc vs /etc/profile中的环境变量关系?
整数
暂无
字符串
字符串形式:
- 单引号:
不能包含变量; 原样输出;
- 双引号:
可以包含变量;可以有转义字符;可以包含单引号;
各种操作
- 拼接:把字符串/变量连在一起就行了(不需要任何符号)
- 长度:${#strval}
- 截串:${string:1:4}
- 查找子串:
expr index "$string" u
数组
只支持一维数组
Array=(1 2 3 4),值之间的隔离用 空格或者换行。
各种操作:
- 单个元素获取:${array[0]}
- 获取全部元素:
arrayname[@] {array_name[*]} - 数组的长度:{#array_name[@]} 或者{#array_name[*]}
- 单个元素的长度:lengthn=${#array_name[n]}
参数
# function showDollarVar(){ echo '-------------$*' for arg in $* do echo $arg done echo '-------------"$*"' for arg in "$*" do echo $arg done echo '-------------$@' for arg in $@ do echo $arg done echo '-------------"$@"' for arg in "$@" do echo $arg done}showDollarVar "hua jiang hu" zhiroot@shellLang# ./grammar.sh -------------$* #以一个单字符串的形式显示所有向脚本传递的参数。huajianghuzhi-------------"$*" #全部参数视为一个整体hua jiang hu zhi-------------$@ #同于没有加“”的$*huajianghuzhi-------------"$@" #原始参数一个个解析出来(默认为空格)hua jiang huzhi
分支控制
要将分支控制的助词如then, do提前一句,那么需要在前一句话后加分号;再加此助词。
如
if []; then .. fi for [] ; do ..done
if
if [ $a -eq $b ]then echo $a "==" $belif [ $a -gt $b ]; then echo $a ">" $belse echo $a "<" $bfi
for
#for ((i=0; i<5; i++))#for (( i=0; i<5; i++ ))for i in 0 1 2 3 4 #只能空格为间隔,加,则会解释成数据do echo 'hello', $idone
while
#while(($a<=3)) ##cant use -lewhile [ $a -le 3 ]do echo $a let "a++"done
死循环
while(true) while [ true/1/false ] for ((;;))
函数
形式如下
# 不带任何参数# /bin/sh不能带function关键字,/bin/bash则可有可无function[ function ] funname [()]{ action; # 如果不加,将以最后一条命令运行结果,作为返回值。 [return int;] #return后跟数值n(0-255)}
运算符
- 算术运算符
+、-、*、/、%、=、==、!=原生的bash不支持,得借助(let,expr,..)之类的表达式计算工具。
let a=a+1`expr $a + $b` #注意:表达式与运行符号之间必须要空格。# 注意:乘号*需要转义。
- 字符串运算符
=判等、!=
-z长度是否为0、-n长度是否不为0
str是否不为空(这点如下)。
if [ $string ]; then echo ‘string not empty’ fi
布尔运算符
!非、-o或、-a与
逻辑运算符
&&逻辑与、||逻辑或
test测试
- 数值测试:
- -eq等于则为真、-ne
- -gt大于, -lt
- -ge大于等于、-le
- 字符串测试:
- =, !=,
- -z –n
文件测试:
- -e文件存在
- -f文件存在且为普通文件
- -r, -w, -x, -s, -d, -c, -b
文件测试运算符:[ -r $file ]
-r file 检测文件是否可读,如果是,则返回 true。
-w file 检测文件是否可写,如果是,则返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。
-d file 检测文件是否是目录,如果是,则返回 true。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
-b file 检测文件是否是块设备文件,如果是,则返回 true。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。
-p file 检测文件是否是有名管道,如果是,则返回 true。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。
输入、输出
Echo
Echo –e “…\x” 开启转义Echo –e “…\c” 不换行
printf 比echo更强大,移植性更好;
printf format-string [arguments...]
0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。
输入出重定向
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。
$ command > /dev/null 2>&1
- shell-grammar
- PROTEL GRAMMAR
- Grammar 01
- XSL Grammar
- Grammar API
- Vim Grammar
- English grammar
- C++ Grammar
- python-grammar
- ABNF Grammar and ASN.1 Grammar
- Operator Grammar and Operator Precedence Grammar
- boost.spirit -- grammar
- Java unusually grammar
- The Good Grammar Book :
- Grammar collection 02
- [轉] Grammar Rules!?
- 【H2】H2 SQL Grammar
- prolog : Grammar and Parsing
- JSP内置对象的使用:request,cookie,session
- Android启动流程(一)
- 看雪ctf2017第一题详解
- Properties配置文件数据加密
- Java抽象类
- shell-grammar
- Android Studio 使用教程(二十一)之Android Studio如何快速生成get和set
- map根据其value值进行排序
- 关于SpringDataJPA的一些小知识
- Hdu A+B for Input-Output Practice (VII)
- Java指定保留小数位数的方法
- 解决Python字符串显示u'...'的问题
- 虚函数
- shell-commands