进阶(待续)"/>
shell 进阶(待续)
文章目录
- 1.bash之hello world
- 2.bash基础
- 2.1 变量
- 2.2 字符串
- 2.3 数组
- 2.4循环
- 2.5.条件
- 2.6.bash脚本命令
- 2.7脚本参数
- 2.8 错误日志输出
- 2.9.代码注释
- 3.编码转换
常识:
Shell 编程跟 java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Linux 的 Shell 种类众多,常见的有:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
……
本教程关注的是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。
1.bash之hello world
#!/bin/bash
echo "Hello World !"
#!
是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
2.bash基础
2.1 变量
- 变量类型
- 局部变量:局部变量在脚本或命令中定义,仅在当前shell实例中有效.其他shell启动的程序不能访问局部变量.
- 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量.有些程序需要环境变量来保证其正常运行.必要的时候shell脚本也可以自定义环境变量.
- shell变量:shell变量时由shell程序设置的特殊变量.shell变量中有一部分是环境变量,有一部分是局部变量.这些变量保证了shelll的正常运行.
- 定义变量
your_name="runoob"
tips:
- 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
- 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
- 使用变量
在变量名前加 ” $ ” 即可.(再次赋值时,不需要加 ” $ ” )
${name}
或者$name
(变量名的大括号为可选项.为了方便解释器识别变量的边界
{}标识括号内的值为变量) - 只读变量
使用readonly 命令可以将变量属性定义只读.name=’test’ readonly name
- 删除变量
unset命令可以删除变量,直接unset “变量名”
ex:unset“a”
2.2 字符串
- 可用单引号或者双引号
- 单引号:任何字符都会原样输出,变量无效,转义字符无效
- 双引号:可包含变量,可用转义字符
- 字符串长度:
${#’变量名’}
表示对应变量名的字符长度(ex.?{#tmp}) - 字符串截取:
${‘变量名’:2:5}
表示从’变量’字符串中的第3个字符开始截取5个字符串
2.3 数组
- 定义
- 法一(直接定义): 数组名=(值1 值2 …值x) 注意是空格分割 (ex:
tmp=("z","s","w")
) - 法二(各分量定义): 数组名[0]=xxx 数组名[1]=xxx 数组名[2]=xxx
- 法一(直接定义): 数组名=(值1 值2 …值x) 注意是空格分割 (ex:
- 读取
- 单元素:
${数组名[下标]}
- 所有元素:
${数组名[@]}与${数组名[*]}
- 单元素:
- 长度:
length=${#数组名[@]}
或length=${#数组名[*]}
(获取方式与字符串长度相同)
2.4循环
- 法一:
for x in `expr 1 100` do …… done
- 法二:
for ((表达式;表达式;表达式)) do …… done
2.5.条件
#!/bin/bash
if (条件1)
then (动作1)
elif (条件2)
then (动作2)
…… (命令)
else (匹配不上其他条件后匹配else)
(else的动作)
fi (条件语句的结束)
2.6.bash脚本命令
命令 | 解释 | 例 |
---|---|---|
source a.sh | 执行shlle脚本a.sh | |
./a.sh | 执行shell脚本a.sh 前提:有执行权限足够 执行权限添加:chmod U+x a.sh | |
env | 查看全部环境变量 | |
export | 添加环境变量 | |
expr | 添加本地变量 | |
read | 用户手动赋值 | |
read -p“提示是信息” | 用户手动进行赋值,引号里面加的是提示信息 | |
pstree | 查看进程树 | |
sh -n | 后面跟shlle脚本文件名,检查编辑的shlle脚本是否有语法错误 | |
let | 做算术运算 | let a= i + 1 运 算 i+1 运算 i+1运算i+1的值赋给a |
break | 跳出当前循环 | |
echo $? | 测试上条命令是否成功,回显0为成功,回显其他都为失败 |
2.7脚本参数
命令 | 解释 | 例 |
---|---|---|
-ge | 大于或等于 | |
-gt | 大于 | |
-le | 小于或等于 | |
-lt | 小于 | |
-eq | 等于 | |
-f | 判断文件是否存在 | if [ -f $a.out ] |
-d | 判断目录是否存在 | if [ -d $aaa ] |
2.8 错误日志输出
标准输入stdin
标准输出stdout
标准错误stderr
三个系统文件的文件描述符分别为0,1和2。
所以在命令后面添加 1>stdout.log 2>stderr.log
表示将标准输出输出到stdout.log文件,把错误输出输出到stderr.log文件
关于 > 标准输处和标准错误重定向到同一log文件中
2.9.代码注释
单行注释:#code
多行注释:
: << !
语句1
语句2
语句3
语句4
!
3.编码转换
如果你说中文有哪些优美的地方,语言学家说他能表达不了其他语言的深意;学习中文的歪果仁说它怎么一个读音有那么多字,一个字还有那么多意思。。。;而对于一个程序猿来说,他的优美之处便是有那多编码,你都不知道什么时候会报一个编码错误,有同感吗?扯远了,进入正题~
#!/bin/bash
rootDir=offline_data/online_dispose
outDir=offline_data/online_dispose_gbk
for file in `ls ./$rootDir`
doecho ./$rootDir/$file iconv -f utf-8 -t GBK -c ./$rootDir/$file > ./$outDir/$file #这里-f表示from -t表示to 分别表示从什么语言转换成什么语言~
done
参考链接
- bash基础教程
更多推荐
shell 进阶(待续)
发布评论