shell脚本学习一

来源:互联网 发布:淘宝字体图标 编辑:程序博客网 时间:2024/04/30 12:21

简单而言,command line的每一个charactor分为如下两种:
   *literal:也就是普通纯文字,对shell来说没有特殊功能。
   *meta:对shell来说,具有特定功能的保留字。

literal没有什么好说的,凡是 abcd、123456 等这些“文字”都是literal。但是meta确常使我们困惑。事实上,前两章我们在command line中已碰到两个几乎每次都会碰到的meta:
    *IFS:由<space> <tab> <enter>三者之一组成(我们常用space)。
    *CR:由<enter>产生。
IFS是用来拆分command line的每一个词(word)用的,因为shell command line是按词来处理的。而CR则是用来结束command line用的,这也是为何我们敲<enter>命令就会执行的原因。除了IFS和CR外,常用的meta还有:
= :  设定变量。
$ :  做变量或运算替换(请不要与 shell prompt 搞混了)。
> :  重定向 stdout。
< :  重定向 stdin。
|:   管道命令。
& :  重定向 file descriptor ,或将命令置于后台执行。
( ): 將其內的命令置于 nested subshell 执行,或用于运算或命令替换。
{ }: 將其內的命令置于 non-named function 中执行,或用在变量替换的界定范围。
; :  在前一个命令结束时,而忽略其返回值,继续执行下一個命令。
&& : 在前一個命令结束时,若返回值为 true,继续执行下一個命令。
|| : 在前一個命令结束时,若返回值为 false,继续执行下一個命令。
!:   执行 history 列表中的命令
....

假如我们要在command line中将这些保留元字符的功能关闭的话,就要用到 quoting 处理了。
在bash中,我们常用的 quoting有如下三种方法:
    *hard quote:''(单引号),凡在hard quote中的所有meta均被关闭。
    *soft quote:""(双引号),在soft quote中的大部分meta都会被关闭,但某些保留(如$)。
    *escape:\ (反斜线),只有紧接在escape(跳脱字符)之后的单一meta才被关闭。


        $ A=B C        # 空白键未被关闭,作为IFS 处理。
        $ C: command not found. 
        $ echo $A
        
        $ A="B C"        # 空白键已被关闭,仅作空白符号处理。
        $ echo $A
        B C


一、echo 单引号、双引号和不加引号的区别 

单引号会无视其中的所有特殊符号双引号中有三种特殊字符不被忽略$,\,`不加引号则不忽略所有特殊字符。例如,编写一个shell脚本,

  1. [lfs@lfs tmp]$ a='b c'
  2. [lfs@lfs tmp]$ echo $a
  3. b c
  4. lfs@lfs tmp]$ echo '$a'
  5. $a

下面的例子中,第二个命令由于没有关闭()这个meta,命令执行的时候shell首先解释(),当然出现错误了。

  1. [lfs@lfs tmp]$ echo '('$a')'
  2. (b c)
  3. [lfs@lfs tmp]$ echo ($a)
  4. -bash: syntax error near unexpected token `$a'

下面的例子中,因为单引号被双引号括起来,所以shell不会解释单引号,单引号就会被echo命令显示

  1. [lfs@lfs tmp]$ echo "('$a')"
  2. ('b c')

考虑一下为什么下面的例子和上面的输出结果不一样。

  1. [lfs@lfs tmp]$ echo '("$a")'
  2. ("$a")
echo “this is the ${num}nd”
这将打印: this is the 2nd



名为date,内容如下:

echo '$USER date *'

echo "$USER date *"

echo $USER date *

date

当前文件夹下有2个文件,分别为date和welcome,运行date输出结果为:

$USER date *

root date *

root date date welcome












      在win下创建的XX.sh文件,在linux上执行,经常执行失败。对比能执行的文件,没有发现什么不同。

                执行shell出现的错误是bad interpreter:No such file or directory


解决方法:

       因为操作系统是windows,在windows下编辑的脚本,所以有可能有不可见字符。从的脚本及报告的错误看来很有可能是脚本文件DOS格式即每一行的行尾以\r\n来标识ASCII码分别是0x0D, 0x0A. 可以有很多种办法看这个文件是DOS格式的还是UNIX格式的还是MAC格式的。 linux的换行\n,

1vi filename
    然后用命令
         :set ff
可以看到dosunix的字样如果的确是dos格式的那么你可以用set ff=unix把它强制为unix格式的然后存盘退出再运行一遍.


(2) 用od -t x1 filename
如果你看到有0d 0a 这样的字符那么它是dos格式的如果只有0a而没有0d, 那么它是UNIX格式的同样可以用上述方法把它转为UNIX格式的.

转换不同平台的文本文件格式可以用
1. unix2dosdos2unix这两个小程序来做很简单djgpp中这两个程序的名字叫dtouutod, u代表unix, d代表dos
2. 也可以用sed 这样的工具来做:
sed 's/^M//' filename > tmp_filename
mv -f tmp_filename filename
来做
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 点痣留下褐色印怎么办 氮氧传感器坏了怎么办 考试车离合太松怎么办 胎心监护不过关怎么办 羚羊角的功效与作用发烧怎么办 小孩上课注意力不集中怎么办 2岁宝宝不会说话怎么办 小孩脖子上长淋巴结怎么办 小孩子上课注意力不集中该怎么办 脸过敏干燥起皮怎么办 脸上皮肤干燥起皮怎么办 身上皮肤干燥起皮怎么办 皮肤暗黄有色斑怎么办 我皮肤干燥暗黄怎么办 脸上有皮肤暗黄怎么办 皮肤暗黄毛孔大怎么办 脸上很干燥起皮怎么办 脸上的皮肤起皮怎么办 身体的皮肤好干怎么办 滴油雾化器炸油怎么办 已经发炎的痘痘怎么办 被养生馆骗了怎么办 做完微针结痂了怎么办 秋季脸干燥起皮怎么办 身上的皮肤太干怎么办 板材眼镜腿松了怎么办 超声刀后喝酒了怎么办 开眼角疤痕增生了怎么办 开了眼角有增生怎么办 全切双眼皮留疤怎么办 开内眼角留疤了怎么办 开眼角长了颗粒怎么办 开刀后疤痕庝痛怎么办 眼角开得太尖了怎么办 眼角开得太大了怎么办 开眼角后增生了怎么办 下颌骨宽怎么办不整容 脸两边骨头太宽怎么办 接了睫毛眼睛疼怎么办 下颌骨错位脸歪怎么办 假体隆鼻感冒了怎么办