shell编制程序入门:

Shell基础发轫学习,Shell基础学习

Shell帮助自定义变量。

Shell 变量

概念变量时,变量名不加新币符号($,PHP语言中变量须求),如:

your_name="runoob.com"

瞩目,变量名和等号之间无法有空格,那恐怕和您熟谙的持有编制程序语言都不均等。同时,变量名的命名须遵从如下规则:

  • 第③个字符必须为字母(a-z,A-Z)。
  • 高级中学档不能够有空格,能够动用下划线(_)。
  • 不可能应用标点符号。
  • 不能够运用bash里的首要字(可用help命令查看保留首要字)。

除了显式地一向赋值,还能用语句给变量赋值,如:

for file in  `ls /etc`

以上语句将 /etc 下目录的文书名循环出来。


  程序员标配:第①个shell脚本 输出 —- ” Hello World !!”

Shell

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell
既是一种命令语言,又是一种程序设计语言。

Shell
是指一种应用程序,那么些应用程序提供了1个界面,用户通过那一个界面访问操作系统内核的劳动。

Ken 汤普森 的 sh 是第1种 Unix Shell,Windows Explorer
是贰个卓绝的图形界面 Shell。

Shell 在线工具


概念变量

概念变量时,变量名不加台币符号($),如:

澳门金沙国际 1

小心,变量名和等号之间不能够有空格,那恐怕和你熟习的享有编制程序语言都分裂等。同时,变量名的命名须依照如下规则:

壹 、第陆个字符必须为字母(a-z,A-Z)。

二 、中间不能够有空格,能够采纳下划线(_)。

叁 、不可能动用标点符号。

④ 、不可能应用bash里的严重性字(可用help命令查看保留主要字)。

变量定义举例:

澳门金沙国际 2

运用变量

动用贰个定义过的变量,只要在变量名前边加日元符号即可,如:

your_name="qinjx" echo $your_name
echo ${your_name}

变量名外面包车型大巴花括号是可选的,加不加都行,加花括号是为了扶持解释器度和胆识别变量的边际,比如上边那种场合:

for skill in Ada Coffe Action Java; do echo “I am good at
${skill}Script” done

一旦不给skill变量加花括号,写成echo “I am good at
$skillScript”,解释器就会把$skillScript当成贰个变量(其值为空),代码执行结果就不是我们意在的样板了。

引进给持有变量加上花括号,那是个好的编制程序习惯。

已定义的变量,能够被重新定义,如:

your_name="tom" echo $your_name
your_name="alibaba" echo $your_name

如此写是官方的,但注意,第一回赋值的时候不能够写$your_name=”alibaba”,使用变量的时候才加新币符($)。

  壹 、先创立3个hello.sh脚本文件

Shell 脚本

Shell 脚本(shell script),是一种为 shell 编写的台本程序。

产业界所说的 shell 平日都以指 shell 脚本,但shell 和 shell script
是多个不一致的概念。


利用变量

运用三个概念过的变量,只要在变量名前边加韩元符号($)即可,如:

澳门金沙国际 3

变量名外面包车型地铁花括号是可选的,加不加都行,加花括号是为着援救解释器度和胆识别变量的疆界,比如上面那种状态:

澳门金沙国际 4

借使不给skill变量加花括号,写成echo “I am good at
$skillScript”,解释器就会把$skillScript当成贰个变量(其值为空),代码执行结果就不是我们盼望的指南了。

引进给全体变量加上花括号,那是个好的编制程序习惯。

只读变量

应用 readonly 命令能够将变量定义为只读变量,只读变量的值无法被改成。

上边包车型客车事例尝试更改只读变量,结果报错:

#!/bin/bash myUrl="http://www.w3cschool.cc"  readonly myUrl
myUrl="http://www.runoob.com"

运作脚本,结果如下:

/bin/sh: NAME:  This variable is read only.

  

Shell 环境

Shell 编制程序跟 java、php
编程一样,只要有1个能编写代码的文件编辑器和1个能分解实施的本子解释器就能够了。

澳门金沙国际,Linux 的 Shell 体系众多,常见的有:

Bourne Shell(/usr/bin/sh或/bin/sh) ——Bash

Bourne Again Shell(/bin/bash)

C Shell(/usr/bin/csh)

K Shell(/usr/bin/ksh)

Shell for Root(/sbin/sh)

……

Bash 是当先八分之四Linux 系统暗中同意的 Shell。一般意况下,并不区分 Bourne Shell
和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也能够改为
#!/bin/bash。

#! 告诉系统其后路径所钦点的次第就是解释此脚本文件的 Shell 程序。


重复定义变量

已定义的变量,能够被另行定义,如:

澳门金沙国际 5

如此写是官方的,但只顾,第贰回赋值的时候不可能写
$myUrl=”

删除变量

使用 unset 命令能够去除变量。语法:

unset variable_name

变量被删除后不可能重新利用。unset 命令不可能去除只读变量。

实例

#!/bin/sh myUrl="http://www.runoob.com" unset myUrl
echo $myUrl

如上实例执行将从未任何输出。

vi    hello.sh

第一个shell脚本

打开文本编辑器(能够运用 vi/vim 命令来创设文件),新建3个文书
test.sh,扩张名为
sh(sh代表shell),增加名并不影响脚本执行,见名知意就好,即便您用 php 写
shell 脚本,扩张名就用 php 好了。

输入一些代码,第①行一般是那般:

的变量类型,Shell基础伊始学习。只读变量

使用readonly指令能够将变量定义为只读变量,只读变量的值不可能被改变。

上面包车型的士例证尝试更改只读变量,结果报错:

澳门金沙国际 6

运营脚本,结果如下:

澳门金沙国际 7

变量类型

运转shell时,会同时存在两种变量:

  • 1) 局地变量
    局地变量在本子或指令中定义,仅在时下shell实例中有效,其余shell运行的程序无法访问一些变量。
  • 2) 环境变量
    全数的程序,蕴涵shell运营的程序,都能访问环境变量,有些程序须求环境变量来确认保障其健康运营。供给的时候shell脚本也得以定义环境变量。
  • 3) shell变量
    shell变量是由shell程序设置的优良变量。shell变量中有一部分是环境变量,有一部分是局地变量,那一个变量保证了shell的正常化运转

  然后在输入代码:

实例

#!/bin/bash
echo “Hello World !”
运作实例 ?

#! 是四个预约的记号,它报告系统这些本子必要什么解释器来推行

去除变量

使用unset命令能够去除变量。语法:

澳门金沙国际 8

变量被去除后不能够再一次使用;unset 命令无法去除只读变量。

举个例证:

澳门金沙国际 9

上边的脚本没有别的输出。

变量类型

运作shell时,会同时存在三种变量:

1) 局地变量

有的变量在本子或指令中定义,仅在近期shell实例中央银卓有成效,其余shell运营的顺序不能访问一些变量。

2) 环境变量

不无的顺序,包涵shell运行的顺序,都能访问环境变量,有个别程序必要环境变量来保管其健康运作。须求的时候shell脚本也足以定义环境变量。

3) shell变量

shell变量是由shell程序设置的与众不相同变量。shell变量中有一些是环境变量,有部分是一对变量,那些变量有限支撑了shell的例行运作

 /*#!告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序*/

#!/bin/bash 
echo "Hello World !!"

运转 Shell 脚本有三种办法:

① 、作为可执行程序

将地点的代码保存为 test.sh,并 cd 到相应目录:

chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本

注意,一定要写成 ./test.sh,而不是
test.sh,运转其它二进制的程序也一如既往,直接写 test.sh,linux 系统会去
PATH 里搜索有没有叫 test.sh 的,而唯有 /bin, /sbin, /usr/bin,/usr/sbin
等在 PATH 里,你的当前目录平日不在 PATH 里,所以写成 test.sh
是会找不到命令的,要用./test.sh 告诉系统说,就在当前目录找。

二 、作为解释器参数

那种运转格局是,直接运转解释器,其参数正是 shell 脚本的文书名,如:

/bin/sh test.sh
/bin/php test.php

那种方法运维的剧本,不必要在率先行钦定解释器新闻,写了也没用。

参考资料

Shell变量:Shell变量的概念、删除变量、只读变量、变量类型

  保退出后运营脚本(chmod +x 是脚本有实施的权柄):

Shell 变量

概念变量时,变量名不加法郎符号($,PHP语言中变量须要),如:

your_name="come"

小心,变量名和等号之间不能够有空格,那或然和你熟习的有着编程语言都分歧等。同时,变量名的命名须根据如下规则:

取名只能利用英文字母,数字和下划线,第③个字符不能以数字开首。

中档不可能有空格,能够行使下划线(_)。

不可能选取标点符号。

不可能动用bash里的基本点字(可用help命令查看保留首要字)。

除开显式地直接赋值,还能用语句给变量赋值,如:

for file in `ls /etc`

以上语句将 /etc 下目录的文件名循环出来。


chmod    +x    ./hello.sh  #使脚本有执行的权限

./hello.sh  #执行脚本

应用变量

采纳三个定义过的变量,只要在变量名前边加美金符号即可,如:

your_name="qinjx"
echo $your_name
echo ${your_name}

变量名外面包车型地铁花括号是可选的,加不加都行,加花括号是为了帮忙解释器度和胆识别变量的分界,比如上面那种景况:

for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done

假诺不给skill变量加花括号,写成echo “I am good at
$skillScript”,解释器就会把$skillScript当成1个变量(其值为空),代码执行结果就不是我们期望的样子了。

引进给持有变量加上花括号,那是个好的编制程序习惯。

已定义的变量,能够被另行定义,如:

your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name

那样写是合法的,但注意,第①遍赋值的时候不可能写$your_name=”alibaba”,使用变量的时候才加美金符($)。

  然后就会输出Hello World !!

只读变量

运用 readonly 命令能够将变量定义为只读变量,只读变量的值不能够被改成。

上边的例子尝试更改只读变量,结果报错:

#!/bin/bash
my="http"
readonly myUrl
my="https"

运营脚本,结果如下:

/bin/sh: NAME: This variable is read only.

  就算直接用    /*   ./hello.sh   */    运营的话权限大概不够

除去变量

应用 unset 命令能够去除变量。语法:

unset variable_name

变量被删除后不能重复行使。unset 命令无法去除只读变量。

  澳门金沙国际 10

变量类型

运维shell时,会同时存在三种变量:

1) 局地变量
局地变量在剧本或指令中定义,仅在现阶段shell实例中央银立竿见影,别的shell运转的次第无法访问片段变量。

2) 环境变量
全数的次序,包含shell运行的次序,都能访问环境变量,有些程序供给环境变量来确认保障其常规运作。须求的时候shell脚本也足以定义环境变量。

3) shell变量
shell变量是由shell程序设置的相当变量。shell变量中有局地是环境变量,有局地是有的变量,那个变量保障了shell的正规运作


ok,第多少个hello world脚本就做到了。

Shell 字符串

字符串是shell编制程序中最常用最实惠的数据类型(除了数字和字符串,也没啥其余连串好用了),字符串能够用单引号,也足以用双引号,也能够毫无引号。单双引号的分别跟PHP类似。

 

单引号

str='this is a string'

单引号字符串的限制:

单引号里的任何字符都会原样输出,单引号字符串中的变量是不著见效的;

单引号字串中无法冒出单引号(对单引号使用转义符后也极度)。


双引号

your_name='qinjx'
str="Hello, I know your are \"$your_name\"! \n"

双引号的帮助和益处:

双引号里能够有变量

双引号里能够出现转义字符

 

拼接字符串

your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1

接下去开端读书shell变量:

赢得字符串长度

string="abcd"
echo ${#string} #输出 4

  ① 、首先定义变量

领取子字符串

以下实例从字符串第 2 个字符初步截取 4 个字符:

string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
my_name="dongxiucai"

查找子字符串

摸索字符 “i 或 s” 的地点:

string="runoob is a great company"
echo `expr index "$string" is`  # 输出 8

专注: 以上脚本中 “`” 是反引号,而不是单引号 “‘”。


  值得注意的是:变量名和等号之间不能够有空格,那或者和您熟知的装有编制程序语言都不平等。

Shell 数组

bash帮助一维数组(不支持多维数组),并且没有范围数组的深浅。

看似与C语言,数组成分的下标由0起先编号。获取数组中的成分要利用下标,下标能够是整数或算术表达式,其值应当先或等于0。

  同时,变量名的命名须遵从如下规则:

概念数组

在Shell中,用括号来代表数组,数组成分用”空格”符号分割开。定义数组的形似格局为:

数组名=(值1 值2 ... 值n)

例如:

array_name=(value0 value1 value2 value3)

或者

array_name=(
value0
value1
value2
value3
)

还足以单独定义数组的逐一分量:

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

能够不行使再而三的下标,而且下标的限定没有界定。

    •   命名只可以使用英文字母,数字和下划线,第多个字符无法以数字初阶。
    •   中间无法有空格,能够行使下划线(_)。
    •   无法运用标点符号。
    •   无法选用bash里的重中之重字(可用help命令查看保留主要字)。

读取数组

读取数组成分值的貌似格式是:

${数组名[下标]}

例如:

valuen=${array_name[n]}

使用@符号能够取得数组中的全体因素,例如:

echo ${array_name[@]}

  贰 、使用变量

获得数组的长短

获取数主管度的艺术与收获字符串长度的艺术一致,例如:

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

    在利用定义过的一个变量时要加   $    符号  ,例:

Shell 注释

以”#”开始的行正是注释,会被解释器忽略。

sh里没有多行注释,只好每一行加1个#号。

要是在开发进度中,碰着大段的代码必要如今注释起来,过会儿又撤销注释,怎么做吧?

每一行加个#标记太费劲了,能够把这一段要诠释的代码用一对花括号括起来,定义成3个函数,没有地点调用那个函数,那块代码就不会执行,达到了和注释一样的法力。

  

游玩解压:

#!/bin/bash          # !/bin/bash 表示在当前路径下查找
# Usage:             ##表示注释,且只能一行一行注释;多行时用大括号括起来不调用就没关系

 #set 显示系统中已经存在的shell变量,设置变量的新变量值,- 表示关闭;+表示打开;

set -x              # x表示执行指令后,会先执行该指令以及所下的参数
set -e              # e表示若指令传回值不等于0,则立即退出shell

export PYTHONUNBUFFERED="True"  #设置环境变量

GPU_ID=$1       #变量以及赋值
NET=$2
NET_lc=${NET,,}
DATASET=$3

array=( [email protected] )
len=${#array[@]}
EXTRA_ARGS=${array[@]:3:$len}
EXTRA_ARGS_SLUG=${EXTRA_ARGS// /_}

case $DATASET in
  pascal_voc)
    TRAIN_IMDB="voc_2007_trainval"
    TEST_IMDB="voc_2007_test"
    PT_DIR="pascal_voc"
    ITERS=40000
    ;;
  coco)
    TRAIN_IMDB="coco_2014_train"
    TEST_IMDB="coco_2014_minival"
    PT_DIR="coco"
    ITERS=280000
    ;;
  *)
    echo "No dataset given"
    exit
    ;;
esac

LOG="experiments/logs/fast_rcnn_${NET}_${EXTRA_ARGS_SLUG}.txt.`date +'%Y-%m-%d_%H-%M-%S'`"
exec &> >(tee -a "$LOG")
echo Logging output to "$LOG"

time ./tools/train_net.py --gpu ${GPU_ID} \
  --solver models/${PT_DIR}/${NET}/fast_rcnn/solver.prototxt \
  --weights data/imagenet_models/${NET}.v2.caffemodel \
  --imdb ${TRAIN_IMDB} \
  --iters ${ITERS} \
  ${EXTRA_ARGS}

set +x
NET_FINAL=`grep -B 1 "done solving" ${LOG} | grep "Wrote snapshot" | awk '{print $4}'`
set -x

time ./tools/test_net.py --gpu ${GPU_ID} \
  --def models/${PT_DIR}/${NET}/fast_rcnn/test.prototxt \
  --net ${NET_FINAL} \
  --imdb ${TEST_IMDB} \
  ${EXTRA_ARGS}

照旧看完再读吧!
 

Shell Shell
是一个用 C 语言编写的次序,它是用户使用 Linux 的大桥。Shell
既是一种命令语言,又是一种程序…

#!/bin/bash
my_name="dongxiucai"
echo $my_name

  运营结果如下:

     
 澳门金沙国际 11

  在运用变量时,能够在变量名外面加3个花括号,列:

  

${my_name}

  变量名外面包车型客车花括号是可选的,加不加都行,加花括号是为了帮扶解释器度和胆识别变量的界线,比如上面那种景况:

echo "${my_name}you are good"

  在地点代码中一旦不给my_name加花括号,解释器就会把   $my_nameyou  
 当成三个变量。就会产生错误

  在给变量赋值时得以像那样赋值,和任何的编制程序语言类似

your_name=$my_name

  3、补充

    只读变量:该变量的值无法被改成,定义此变量必要   readonly
 命令,例:

  

my_name="dongxiucai"
readonly my_name

    删除变量:使用 unset 命令能够去除变量,例:

unset your_name

    注意:变量被去除后不能够再一次使用,同时   readonly  
定义的只读变量不能够被删除

    变量类型:

    运维shell时,会同时存在三种变量:

    •   局地变量:有的变量在本子或指令中定义,仅在如今shell实例中有效,其余shell运营的程序不能够访问一些变量。
    •   环境变量 :全数的程序,包罗shell运维的顺序,都能访问环境变量,有个别程序须求环境变量来确定保证其健康运营。要求的时候shell脚本也足以定义环境变量。
    •   shell变量 :shell变量是由shell程序设置的非正规变量。shell变量中有一些是环境变量,有部分是一对变量,这个变量保障了shell的例行运作

    

 

相关文章