免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1473 | 回复: 0
打印 上一主题 下一主题

bash shell 学习笔记(第一天) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-18 15:58 |只看该作者 |倒序浏览

                                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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP