Chinaunix首页 | 论坛 | 博客
  • 博客访问: 201171
  • 博文数量: 43
  • 博客积分: 2178
  • 博客等级: 大尉
  • 技术积分: 390
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 15:19
文章分类

全部博文(43)

文章存档

2012年(23)

2011年(10)

2009年(10)

分类: LINUX

2009-11-18 15:58:14

bash shell 学习笔记(第一天)

跳开 “为什么使用shell 或 bash”  这个大家学习之前都应该有所了解吧, 在此就不再阐述。

1,第一部分 基础知识

#特殊字符
 首行以##!是个例外哟)开头的就是注释啦   #! 的作用是调用相关的程序来执行下面的脚本 
 
如 #!/bin/bash

 注释也可以放到本行命令的后面 如:
 
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$ { 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=$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) |
给主人留下些什么吧!~~