bash shell 学习笔记(第一天)
跳开 “为什么使用shell 或 bash” 这个大家学习之前都应该有所了解吧, 在此就不再阐述。
1,第一部分 基础知识
#特殊字符
首行以#(#!是个例外哟)开头的就是注释啦 #! 的作用是调用相关的程序来执行下面的脚本
注释也可以放到本行命令的后面 如:
echo 'coding' # 这是注释 echo coding # 这也是注释 echo coding \# 也不是注释啦 \是转义字符 他会输出 coding # 也不是注释啦 |
# 命令分隔符
echo 'hello'; echo 'three' # 一行写多条命令 if [ -f filename ] ; then # 分割后 if 和then写在一行 fi; echo 'end' # if判断结束 分割后 也可以再这行写其他命令 |
# 终止case命令 “;;” 双分号
case "$bianliang" in abc) echo "\$bianliang=abc";; def) echo "\$bianliang=def" ;; esac |
#点命令 “.”
点 作为文件的一部分 如果放到文件名称的前面 则这个文件为隐藏文件,
bash$ .hidden_file #隐藏文件 bash$ ./ #当前目录 bash$ ../ #上级目录 bash$ file.txt #标记文件后缀 |
# 符号命令
. #点字符匹配,用于正则表达式中匹配任意单个字符
" #双引号,部分引用,他会解释引号中的变量
' #单引号,全引用,他不会解释任何变量
, #逗号操作符,用来分割一系列算术操作,的最后一项返回 如: let "t2 = ((a=9, 15/3*a))" 返回 t2等于45
\ #转义符,反斜线将特殊字符转义
/ #文件名路径分隔符 /home/vanilla/files
` #命令替换 如: a=`ps -aux` 他可以将结构中的命令赋值到一个变量中
: #空命令 他是bash的内建命令,他是一个什么都不相干的命令
! #取反操作符 感叹号! 他将会反转命令的结果 如: = , != 就是不等的意思
* #通配符,算术操作符,星号 可用于做问假名匹配 如: echo * 则显示 当面目录的所有文件名, 在算术中式乘号的意思 **是求派
$ #引用变量 如 var1=a; echo $var1
$ #行结束符 在正则表达式中
${} #参数替换
$* #位置参数
$@ #位置参数
$? #推出状态码变量.
$$ #进程id变量 他保存了所在脚本的进程ID
() #命令组 如:(a=hello; echo $a) 在括号中的变量是子变量 在括号外不可用
[] #条件测试表达式放入其中,他是shell 内建命令 test的一部分
[[]] #测试, 测试表达式放入其中
[] #数组元素 在一个array结构的上下文中他用来引用每个元素的编号 如: Array[1]=1 echo ${Array[1]}
[] #字符范围 用于正则表达式匹配
(()) # 整数扩展 扩展并计算其中的整数表达式
> &> >& >> < <> 重定向
bash$ script >file1 重定向script的输出文件到file1中 bash$ script &> file1 重定向script的stdout和stderr到file1中 bash$ scriot >&2 重定向script的stdout到stderr中 bash$ script >> file1 吧script的输出追加到file1中如果file1不存在就创建并写入 command [i]<>file1 打开file1用来读写 并且分配文件描述符i给这个文件 如file1不存在就创建
|
<< #用在here document中的重定向
<<< #用在here string 中的重定向
<,> #小于,大于 符 用于 条件判断中 如:if [[ "$a" < "$b" ]];then echo 'true' ;fi
\<, \> #正则表达式边界 如 bash$ grep '\' textfile
| 管道 分析前面的命令并把前面的输出作为后面命令处理的数据
echo pa -aux | grep httpd #列出httpd的进程出来
|
>! #强制重定向 即使设置的noclobber选项 就是 -c 选项 也要强制覆盖现有文件
|| #或 逻辑操作 一个测试结构中的或 表示如果一个成立就不执行其他的选项
& #运行后台命令 一个命令跟一个& 表示后台运行
&& #与-逻辑操作 是在一个条件测试结构中&&两边的结构都为true 就返回正确 及 0
- #选项前缀 如 ls -al ls --help等
+ #加法运算
+ #命令过滤器标志
% #取模取余 操作
~ #home目录 相当于$HOME内部变量
~+ #当前工作目录 相当于 $PWD
~- #先前工作 目录 相当于$OLDPWD内部变量
^ #正则表达式定位文本行的首页
# 大括号扩展{}
bash$ cat {f1,f2,f3} > files #将 f1,f2,f3链接起来重定向到files文件里 bash$ cp file.{txt,backup} #将file.txt 拷贝到file.backup里面去 |
大括号中不允许有空白,除非是转移的 如:
echo {f1,f2}\ :{\ a," b",' c'}
输出 f1 : a f1 : b f1 : c f2 : a f2 : b f2 : c
{}代码块 又被称为内部组 等于是未命名函数
# 检测字符串变量
bash$ : ${HOSTNAME?} ${USER?} # 如果一个或多个必要的变量没被设置就打印错误信息出来 如果不使用这个模式,变量则不提示存在与否 |
# ">" 变量扩展/子串替换
在于>重定向操作符结合使用时 他将会吧一个文件清空 但不会改变文件权限 如果没有这个文件就创建一个文件
bash$ : > date.xxx #将会把date.xxx清空 bash$ cat /dev/null > date.xxx #与上面同样作用 bash$ pa -aux > pafile #将在当前目录创建pafile文件并把 pa -aux 内容写入其中 |
ctrl + s 挂起xoff 冻结终端
ctrl + q 回复终端 这两个命令很管用哦 比如出去上厕所什么以防小人。
2,变量的替换
$ 变量符号
当在给变量赋值时 变量时不需要加$ 但是在打印的时候或者是使用的时候 需要加上$符号
bash$ varlib=23 bash$ echo varlib varlib bash$ echo $varlib 23 |
当变量”裸体”出现的时候 就只能赋值用 否则打印出来的内容就是变量本身
$varlib 这变量其实是${varlib}的简写 在特出情况下简写是不起作用的 。
变量赋值
bash$ var=1
bash$ hello=$var
bash$ codes=`ls -l`
bash$ bl=$(cat /etc/passwd) #这样是更加新的命令替换变量赋值
注:变量是大小写敏感的 。。。 注意哟
3,bash变量是不区别类型的
bash本质上是不区别类型的默认都是字符串,但是也可以做比较和算术操作,前提是变量值是否只有数字
bash$ c=bb32 bash$ d=${c/bb/12} #将bb替换成12,所以变量d变成 1232 |
4,特殊的变量
位置变量 $1 $2 $3.... 到$9以后就要用{}扩住 如:${10} ${11}...
bash$ sh script one two three # one=$1 two=$2
#!/bin/bash echo $1 #1 echo $2 #2 echo $3 #s red=$# #取得位置变量的个数 echo ${!red} #取得位置变量最后一个参数的值 输出 three |
在大部分的位置变量中 为了防止出错 要经过特殊处理如:
var=$1 如果$1为空 将出错
var=$1_ 这样不错出错 但是会多出一个_出来 ,那就这样处理 var1=${var/_/} 这样就取消了_
更安全的就是 判断了
if [-z $1] ;then
exit $E_MISSING_POS_PARAM
fi
#使用 shift 命令
shift命令会重新分配位置参数,他将位置参数往前移 但是$0是不受影响的
#!/bin/bash until [ -z "$1" ] do echo -n "$1" shift 将参数迁移 意思是在此循环的时候 $2已经变成$1了 以此类推 done echo #换行 exit 0 #结束 |
#引用变量 转义
字面意思引用就是吧字符串用双引号括起来 防止被shell 重新的解释
如:
bash$ echo $(ls -l [Vv]*) rw-rw-r-- 1 vanilla vanilla 324 Apr 2 15:05 VIEWDATA.BAT -rw-rw-r-- 1 vanilla vanilla 507 May 4 14:25 vartrace.sh --rw -rw-r-- 1 vanilla vanilla 539 Apr 14 17:11 viewdata.sh
bash$ echo "$(ls -l [Vv]*)" rw-rw-r-- 1 vanilla vanilla 324 Apr 2 15:05 VIEWDATA.BAT -rw-rw-r-- 1 vanilla vanilla 507 May 4 14:25 vartrace.sh -rw-rw-r-- 1 vanilla vanilla 539 Apr 14 17:11 viewdata.sh |
引用后的变量将不会被shell重新的去解释
#转义
echo 和 sed 特定的转移符
\n 表示新一行 \r 表示回车f \t 表示水平制表符 \v 表示垂直制表符
\b 表示后退符 \a 表示“alert“凤鸣或闪烁 \0xx 转换为八进制的ascii码
#退出状态
exit 被用来结束一个脚本 它也返回一个值 这个值会传递给脚本的 父进程 ,父进程可根据使用这个值做下一步处理
#!/bin/bash echo hello echo $? #退出状态为0 sdaf #无效命令 echi $? #非零的退出状态
exit 113 #返回113状态给shell #为了验证结果 在结束地方 使用 exit "echo $?" |
5,条件语句
if/then 结构语句 来判断命令列表的退出状态码是否为0 0表示成功并继续执行
if 命令可以测试任何命令 不仅仅包括中括号的条件
if cmp a b &> /dev/null # 禁止输出 then echo "no" fi
#非常有用的if-grep结构 if grep -q Bash file # -q选项是禁止输出 then echo "file" else echo "no" fi |
elif 是else if 的缩写 他的测试命令与if相同
type 命令 是bash中内建命令 他用来测试文件类型
bash$ type test test is a shell builtin bash$ type '[' [ is a shell builtin bash$ type 'if' if is a shell keyword |
阅读(2005) | 评论(0) | 转发(0) |