- 论坛徽章:
- 0
|
bash shell 学习笔记(第一天)
跳开 “为什么使用shell 或 bash” 这个大家学习之前都应该有所了解吧, 在此就不再阐述。
1,第一部分 基础知识
#特殊字符 首行以[color="#FF0000"]#([color="#FF0000"]#!是个例外哟)开头的就是注释啦 [color="#FF0000"]#! 的作用是调用相关的程序来执行下面的脚本 如 #!/bin/bash
注释也可以放到本行命令的后面 如: echo 'coding' # 这是注释
echo coding # 这也是注释
echo coding \# 也不是注释啦 \是转义字符 他会输出 coding # 也不是注释啦
# 命令分隔符 即 “;”号 可在同一行写多个命令 echo 'hello'; echo 'three' # 一行写多条命令
if [ -f filename ] ; then # 分割后 if 和then写在一行
fi; echo 'end' # if判断结束 分割后 也可以再这行写其他命令 [color="#3D85C6"]# 终止case命令 “;;” 双分号case "$bianliang" in
abc) echo "\$bianliang=abc";;
def) echo "\$bianliang=def" ;;
esac [color="#3D85C6"]#点命令 “.” 点 作为文件的一部分 如果放到文件名称的前面 则这个文件为隐藏文件,
bash$ .hidden_file #隐藏文件
bash$ ./ #当前目录
bash$ ../ #上级目录
bash$ file.txt #标记文件后缀 [color="#3D85C6"]# 符号命令
. #点字符匹配,用于正则表达式中匹配任意单个字符" #双引号,部分引用,他会解释引号中的变量 ' #单引号,全引用,他不会解释任何变量, #逗号操作符,用来分割一系列算术操作,的最后一项返回 如: 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 file1 打开file1用来读写 并且分配文件描述符i给这个文件 如file1不存在就创建
#小于,大于 符 用于 条件判断中 如:if [[ "$a" \ #正则表达式边界 如 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$ { local a; a=123;}
# 检测字符串变量 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=$varbash$ 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
[color="#3D85C6"]#使用 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码
[color="#3D85C6"]#退出状态 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
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/82096/showart_2097645.html |
|