
Shell是一种编程语言, 它像其他编程语言如: C, Java, Python等一样也有数组/函数/运算符/if语句/循环控制/… 但在起初之前, 我想先理清Shell语言与Shell之间的关系.
上面说了Shell是一种编程语言但你也许也听说过:sh/bash/csh/zsh/…它们也叫Shell, 实际上这里所说的Shell是一种应用程序, 它负责解释执行你撰写的Shell脚本, Mac默认就自带了sh/bash/csh/zsh/tcsh/ksh, 你可以这么查看cat /etc/shells
不同的shell的用法基本相似, 但有些shell提供了一些新特点, 比如我今天在用的就是zsh, 更多zsh的内容可以去看这篇文章。
#! /bin/sh echo "hello shell!"
依国际惯例这里以在终端里打印一句hello shell!开始, 第一行的#!是一个约定标记, 它告诉脚本这段脚本必须什么解释器来执行. 第二行的echo命令则负责向屏幕上输出一句话.
运行shell程序有3种方法:
chmod +x使文件带有可执行权限, 直接运行直接读取寄存器, 将脚本文件成为参数传入 (比如bash hi.sh)使用source(也只用 . 代替)执行文件
通常状况下, 最方便的方法就是方式1, 通过形式1执行你必须在脚本第一行写好这段脚本由什么解释器来解释, 而借助形式2来执行则没有这个限制, 写了也没用.
除此之外方式1与方法2执行命令就没有区别了, 但方法3执行的形式与前两种都不同:
使用source执行shell脚本时, 不会创建子进程, 而是在父进程中直接执行!
这里不作更多解释, 感兴趣的朋友可以去参考Linux Shell编程从入门到精通这本书的第一章的相关部分.
和其他语言一样Shell中还有变量, 而且更简单, 但有一些非常特殊的地方.
Shell中的数组只有字符串这一种类型Shell中函数名与变量值没有长度限制Shell的变量也允许非常操作和整数操作, 只要函数中的字符串为数字
variable_name=ghui
需要切记:=两边不能加括号, 当赋值语句包含括号时请加引号(单引号/双引号均可)比如:
variable_name="ghui's blog"
Shell中的变量可以分为两种类别:

局部变量 (定义函数时在后面加local修饰符)全局函数 (定义数组时不加任何修饰符)
与其他语言一样局部变量的可见范围是代码块或数组内, 全局函数在全局范围内可见.看个简单的举例:
#! /bin/sh
num=111 #全局变量
func1()
{
local num=222 #局部变量
echo $num
}
echo "before---$num"
func1
echo "after---$num"
输出:
before---111 222 after---111
使用一个定义过的变量, 只要在变量名后面加$即可, 如:
name=ghui
echo $name
echo ${name} #{} 为了帮助解释器识别变量边界, 非必须
在使用变量时也有一个地方还要留意, 请看上面的举例:
#! /bin/sh str='abc' echo "1 print $str" echo '2 print $str'
输出:
1 print abc 2 print $str
即:
被双引号括出来的变量会出现数组替换, 单引号不会
Shell中注解使用#, 而且它不支持多行注释.
name="shell"
sayHi="hello, "$name" !"
sayHi2="hello, ${name} !"
echo $sayHi $sayHi2
注意:上面说的单双引号引起的变量替换问题
string="abcd"
echo ${#string} #输出:4

str="hello shell"
echo ${str:2} #输出: llo shell
echo ${string:1:3} #输出:ell
更多关于字符串的操作可以看这个
基本语法结构:
if condition then do something elif condition then do something elif condition then do something else do something fi
其中, elif子句和else语句非需要的.看个示例:
#! /bin/sh a=1 if [ $1=$a ] then echo "you input 1" elif [ $1=2 ] then echo "you input 2" else #do nothing echo " you input $1" fi
很简单, 不过这儿有两个地方还要切记, 如果某个条件下的执行体为空, 则你就不能写这个条件 即上面那样会报错:
if condition then #do nothing elif condition then # do nothing #or else #do nothing
另外,[ ]两边一定要加空格, 下面这种就会报错:
if [$a=$b] #or if [ $a=$b] #or if [$a=$b ]
只有这样if [ $a=$b ]才是对的.
注意:实际上这里的[]是test命令的一种形式,[是平台的一个内置命令,存在模式是/bin/[,它是读取test命令的标示shell 编程 if, 右中括号是关闭条件判定的标志, 因此以下的两个测试语句是等效的:
if test "2>3" then ... fi
和
if [ "2>3" ] then ... fi
除[]之外, shell语言中也有几种其它括号, 比如: 单小括号/双小方框/双中括号/… , 不同的括号有不同的用法, 更多关于shell中, 括号的用法可以说说这个
当条件较好时, 可以选用使用switch子句, shell中的switch子句的写法和其他语言而是有些不同的, 基本结构如下:

case expression in pattern1) do something... ;; pattern2) do something... ;; pattern2) do something... ;; ... esac
看个例子:
#! /bin/sh
input=$1
case $input in
1 | 0)
str="一or零";;
2)
str="二";;
3)
str="三";;
*)
str=$input;;
esac
echo "---$str"
这个示例会按照你执行此脚本时传入的参数不同在屏幕上输出不同的值, 其中第一个case1 | 0代表逻辑或.
NOTE:
;;相当于其它语言中的break每个pattern之后记得加)最后记得加esac(即反的case)
基本结构:
for name [in list] do ... done
其中,[]括起来的in list, 为可选部分, 如果省略in list则默认为in "$@", 即你执行此命令时传入的参数列表.
看个例子:
for file in *.txt do open $file done
遍历当前目录下的所有txt文件, 并依次开启.
基本结构:
while condition do do something... done
看个例子:
#! /bin/sh i=0 while ((i<5)); do ((i++)) echo "i=$i" done
输出:

i=1 i=2 i=3 i=4 i=5
NOTE:你也许应该去认识一下(())的用法
基本结构
until condition do do something... done
看个例子:
#! /bin/sh i=5 until ((i==0)) do ((i--)) echo "i=$i" done
输出:
i=4 i=3 i=2 i=1 i=0
shell中也支持break跳出循环,continue跳出本次循环.用法与C,Java中同样
要定义一个函数shell 编程 if, 可以使用以下两种方式:
function funcname()
{
do something
}
或者
funcname ()
{
do something
}
看个例子
#! /bin/sh
# ad.sh 计算sum
add()
{
let "sum=$1+$2"
return $sum
}
add $1 $2
echo "sum=$?"
输入
ad 1 2
输出
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-122011-1.html
别人没反应的吗
既然同性如此重口的事都能想到去合法化了