最近研究下因为需要编译ffmpeg,结果发现需要运行脚本,因此就研究了下shell脚本
注:所有操作均在Mac下进行
1.基本输出
首先:打开终端,然后输入
cd /Users/ytdxxt/Desktop/developer
mkdir script
大体意思为 进入/Users/ytdxxt/Desktop/developer路径下,然后在该路径下,建立一个script的文件夹
接着执行 cd script
vim hello
意为:进入script文件夹下,建立并编辑文件hello
按 i键进行编辑
输入 #!/bin/bash
# Display a line
echo "This is my first shell script program!"
意为 用bash运行该脚本。开头用#!即执行脚本的运行环境
以#开头的行是注释,shell会直接忽略这一行
shell脚本也会忽略空行
echo命令把其参数传递给标准输出,
然后 按退出键 输入:wq!保存退出
后输入 chmod +x hello 即为脚本加上可执行权限
输入 ./hello 执行改文件
会发现终端会输出This is my first shell script program!该内容
2.变量的赋值和使用
还是刚才那个文件
在script文件夹下执行
vim hello
写入 log "Friday"
echo "The value of log is:"
echo $log
退出后执行得到 The value of log is: Friday
其中log 为变量 $用于对一个变量进行解析 shell中碰到 $的变量时会自动将其替换为这个变量的值
注:变量只在脚本中有效,退出后失效
但是source命令可以强行让一个脚本影响其父的shell环境,以下方法可以运行hello脚本时让log在shell环境下可见
source hello
现在输入 echo $log
可以输入 Friday
另一个export是可以让脚本影响其子shell环境
输入export count=10 输出变量count
bash 启动子shell
echo $count 在子shell中显示变量的值
exit 回到先前的shell
注销一个变量 unset
2.变量替换
$是特殊字符,如果希望输出$,那么就该使用转义字符“\”,告知shell忽略特殊字符的特殊含义。
shell 提供{} 来限定 一个变量的开始和结束,在紧跟变量输出字母后缀时,就必须要使用这个功能
vim hello
echo "The value of \$log is:"
echo ${log}day!
保存后执行为The value of $log is Friday!
3.位置变量
shell脚本用位置变量来保存参数,当脚本启动时就必须知道传递给他的参数是什么
新建一个脚本,
输入
#! /bin/bash
echo "\$0 = *$0*"
echo "\$1 = *$1*"
echo "\$2 = *$2*"
echo "\$3 = *$3*"
执行 ./test first second
结果为
$0 = *./test*
$1 = *first*
$2 = *second*
$3 = **
shell的$0这个变量来存放脚本自己的名字。
位置变量
$*参数列表
$@ 包含参数列表
$# 包含参数的个数
举例
vim test1 输入
#! /bin/bash
echo "$# file(s) to list"
#将列表中的值逐一赋给变量file
for file in $@
do
ls -l $file
done
保存退出并修改其权限后执行 ./test1 hello test
得到结果为
-rwxr-xr-x@ 1 ytdxxt staff 87 3 20 16:19 hello
-rwxr-xr-x 1 ytdxxt staff 87 3 20 16:37 test
for 每次从参数列表中($@)中取出一个参数,放到变量file中
4.Bash的引导规则
shell脚本中可以使用的引号有三种
双引号 阻止shell对大多数特殊字符进行解释,但是“$"、“、”和""" 仍然保持其特殊含义
单引号 阻止shell对所有字符进行解释
倒引号“ `" 当用到引号括起来一个shell命令时,这个命令就会被执行。执行后的输出结果作为这个表达式的值倒引号的特殊字符一般都被解释
vim quotes
#! /bin/bash
log=Friday
#双引号会对其中的“$“进行解释
echo "Today is $log"
#单引号不会对特殊字符进行解释
echo ‘Today is $log’
#到引号会运行其中的命令,并把命令输出作为结果
echo "Today is `date`"
执行./quotes 结果为
Today is Friday
Today is $log
Today is 2015年 3月20日 星期五 17时21分49秒 CST
shell运算符
这里仅将不熟悉的列出来
-,+单目负.单目正
^按位异或
shell命令完全复制了C语言中的运算符和优先级规则
注意:在shell中表示相等时,==和=大部分不存在差异
5.表达式求值
vim values
#! /bin/bash
num=1
num=$num+2
echo $num
执行后为1+2
没有输出3
原因 shell脚本是一种弱类型的语言,它并不知道num中保存了一个数值
为了让其得到一个正确的结果
num=$[$num+1]
[]告诉shell应该对其中的表达式求值
对比下
num1=1+2
num2=$[1+2]
echo $num1 $num2
输出结果为1+2 和3
$[]可以使用不同基数的数字,但默认为十进制 可以采用[base#]n来表示从二到36进制的任意一个n值,,其中2#10表示二进制的10
下面几个例子显示如何在$[]使用不同的基数求值
echo $[2#10+1]
echo $[8#10+1]
echo $[16#10+1]
运行得到 3 9 17
expr亦可以对表达式进行求值操作
expr 1+2
得到3
注意:expr会同时将结果输出
 “1” “+” “2” 之间要有空格,否则expr会将其为单纯的字符串输出
expr 还有许多高级用法,这里不再多说
let 用于计算整数表达式的求值

这一秒不放弃,下一秒就会有希望。