past的专栏

最近研究下因为需要编译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 用于计算整数表达式的求值



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

past的专栏

相关文章:

你感兴趣的文章:

标签云: