独立编写shell脚本(SHELL命令编写两个简单的脚本)

2025-10-21 21:15:01 :0

独立编写shell脚本(SHELL命令编写两个简单的脚本)

本篇文章给大家谈谈独立编写shell脚本,以及SHELL命令编写两个简单的脚本对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录

SHELL命令编写两个简单的脚本

第一个脚本:#!/bin/bashread-p"inputfilename:"fnread-p"inputcleartype(one|two|three):"type&&echo"Pleaseinputaexistfilename"&&exit0case$typein"one")cat$fn|sed’s///’|egrep-v’^$|’;;"two")cat$fn|grep’’|grep-v’

如何编写简单的Shell脚本文件之Linux的基本操作

编写shell脚本 首先你要有Linux命令的基础,怎么进入文件,怎么执行文件,有什么命令等等。

  1. 我们的shell 类型有很多,常见的shell环境有sh,bash,csh,zsh等等。在Linux的脚本中可以最常见的就是  sh或者shell。在shell脚本中最开始 要指定shell环境。于是乎我们有了shell的沙邦: 

    /bin/sh 或者/bin/bash

  2. shell脚本的格式:shell脚本一般是以*.sh 为名字,在权限上面是有可执行权限x的也就是chmod u+x *.sh

  3. 命令的执行:3种:

    sh 脚本路径/脚本名

    cd 脚本路径 && ./脚本名

    soure 脚本路径/脚本

  4. 写一个最简单的脚本吧:

#vim 1.sh

/bin/sh

echo "this is my frist scripts,more and more linux ,you can read 《Linux就该这样学》"

#chmod u+x 1.sh

#./1.sh

this is my frist scripts,more and more linux ,you can read 《Linux就该这样学》

学习Linux需要多学多练

如何编写一个shell脚本

如何编写一个shell脚本
本文结合大量实例阐述如何编写一个shell脚本。
  为什么要进行shell编程
  在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具。Shell不仅仅是命令的收集,而且是一门非常棒的编程语言。您可以通过使用shell使大量的任务自动化,shell特别擅长系统管理任务,尤其适合那些易用性、可维护性和便携性比效率更重要的任务。
  下面,让我们一起来看看shell是如何工作的:
  建立一个脚本
  Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的并且很容易使用。所以在本文中笔者所提供的脚本都是使用bash(但是在大多数情况下,这些脚本同样可以在bash的大姐,bourne shell中运行)。
  如同其他语言一样,通过我们使用任意一种文字器,比如nedit、kedit、emacs、vi
  等来编写我们的shell程序。
  程序必须以下面的行开始(必须方在文件的第一行):
  #!/bin/sh
  符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。
  当好脚本时,如果要执行该脚本,还必须使其可执行。
  要使脚本可执行:
  chmod +x filename
  然后,您可以通过输入: ./filename 来执行您的脚本。
  注释
  在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。
  变量
  在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:
  变量名=值
  取出变量值可以加一个美元符号($)在变量前面:
  #!/bin/sh
  #对变量赋值:
  a="hello world"
  # 现在打印变量a的内容:
  echo "A is:"
  echo $a
  在您的器中输入以上内容,然后将其保存为一个文件first。之后执行chmod +x first
  使其可执行,最后输入./first执行该脚本。
  这个脚本将会输出:
  A is:
  hello world
  有时候变量名很容易与其他文字混淆,比如:
  num=2
  echo "this is the $numnd"
  这并不会打印出"this is the 2nd",而仅仅打印"this is the ",因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量:
  num=2
  echo "this is the ${num}nd"
  这将打印: this is the 2nd
  有许多变量是系统自动设定的,这将在后面使用这些变量时进行讨论。
  如果您需要处理数学表达式,那么您需要使用诸如expr等程序(见下面)。
  除了一般的仅在程序内有效的shell变量以外,还有环境变量。由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,因为通常情况下仅仅在登录脚本中使用环境变量。
  Shell命令和流程控制
  在shell脚本中可以使用三类命令:
  1)Unix 命令:
  虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。
  常用命令语法及功能
  echo "some text": 将文字内容打印在屏幕上
  ls: 文件列表
  wc –l filewc -w filewc -c file: 计算文件行数计算文件中的单词数计算文件中的字符数
  cp sourcefile destfile: 文件拷贝
  mv oldname newname : 重命名文件或移动文件
  rm file: 删除文件
  grep ’pattern’ file: 在文件内搜索字符串比如:grep ’searchstring’ file.txt
  cut -b colnum file: 指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第5个到第9个字符cut -b5-9 file.txt千万不要和cat命令混淆,这是两个完全不同的命令
  cat file.txt: 输出文件内容到标准输出设备(屏幕)上
  file somefile: 得到文件类型
  read var: 提示用户输入,并将输入赋值给变量
  sort file.txt: 对file.txt文件中的行进行排序
  uniq: 删除文本文件中出现的行列比如: sort file.txt | uniq
  expr: 进行数学运算Example: add 2 and 3expr 2 "+" 3
  find: 搜索文件比如:根据文件名搜索find . -name filename -print
  tee: 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile
  basename file: 返回不包含路径的文件名比如: basename /bin/tux将返回 tux
  dirname file: 返回文件所在路径比如:dirname /bin/tux将返回 /bin
  head file: 打印文本文件开头几行
  tail file : 打印文本文件末尾几行
  sed: Sed是一个基本的查找替换程序。可以从标准输入(比如命令管道)读入文本,并将结果输出到标准输出(屏幕)。该命令采用正则表达式(见参考)进行搜索。不要和shell中的通配符相混淆。比如:将linuxfocus 替换为 LinuxFocus :cat text.file | sed ’s/linuxfocus/LinuxFocus/’ 》 newtext.file
  awk: awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。cat file.txt | awk -F, ’{print $1 "," $3 }’这里我们使用,作为字段分割符,同时打印第一个和第三个字段。如果该文件内容如下: Adam Bor, 34, IndiaKerry Miller, 22, USA命令输出结果为:Adam Bor, IndiaKerry Miller, USA
  2) 概念: 管道, 重定向和 backtick
  这些不是系统命令,但是他们真的很重要。
  管道 (|) 将一个命令的输出作为另外一个命令的输入。
  grep "hello" file.txt | wc -l
  在file.txt中搜索包含有地hello地的行并计算其行数。
  在这里grep命令的输出作为wc命令的输入。当然您可以使用多个命令。
  重定向:将命令的结果输出到文件,而不是标准输出(屏幕)。
  》 写入文件并覆盖旧文件
  》》 加到文件的尾部,保留旧文件内容。
  反短斜线
  使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。
  命令:
  find . -mtime -1 -type f -print
  用来查找过去24小时(-mtime –2则表示过去48小时)内修改过的文件。如果您想将所有查找到的文件打一个包,则可以使用以下脚本:
  #!/bin/sh
  # The ticks are backticks (`) not normal quotes (’):
  tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`
  3) 流程控制
  "if" 表达式 如果条件为真则执行then后面的部分:
  if ....; then
    ....
  elif ....; then
    ....
  else
    ....
  fi
  大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等…
  通常用" "来表示条件测试。注意这里的空格很重要。要确保方括号的空格。
   :判断是否是一个文件
   :判断/bin/ls是否存在并有可执行权限
   :判断$var变量是否有值
   :判断$a和$b是否相等
  执行man test可以查看所有测试表达式可以比较和判断的类型。
  直接执行以下脚本:
  #!/bin/sh
  if ; then
    echo "your login shell is the bash (bourne again shell)"
  else
    echo "your login shell is not bash but $SHELL"
  fi
  变量$SHELL包含了登录shell的名称,我们和/bin/bash进行了比较。
  快捷操作符
  熟悉C语言的朋友可能会很喜欢下面的表达式:
   && echo "This computer uses shadow passwors"
  这里 && 就是一个快捷操作符,如果左边的表达式为真则执行右边的语句。您也可以认为是逻辑运算中的与操作。上例中表示如果/etc/shadow文件存在则打印地 This computer uses shadow passwors地。同样或操作(||)在shell编程中也是可用的。这里有个例子:
#!/bin/sh
mailfolder=/var/spool/mail/james
’ ’{ echo "Can not read $mailfolder" ; exit 1; }
echo "$mailfolder has mail from:"
grep "^From " $mailfolder
  该脚本首先判断mailfolder是否可读。如果可读则打印该文件中的"From" 一行。如果不可读则或操作生效,打印错误信息后脚本退出。这里有个问题,那就是我们必须有两个命令:
-打印错误信息
-退出程序
  我们使用花括号以匿名函数的形式将两个命令放到一起作为一个命令使用。一般函数将在下文提及。
  不用与和或操作符,我们也可以用if表达式作任何事情,但是使用与或操作符会更便利很多。
  case表达式可以用来匹配一个给定的字符串,而不是数字。
case ... in
...) do something here ;;
esac
  让我们看一个例子。 file命令可以辨别出一个给定文件的文件类型,比如:
file lf.gz
  这将返回:
lf.gz: gzip compressed data, deflated, original filename,
last modified: Mon Aug 27 23:09:18 2001, os: Unix
我们利用这一点写了一个叫做smartzip的脚本,该脚本可以自动解压bzip2, gzip 和zip 类型的压缩文件:
#!/bin/sh
ftype=`file "$1"`
case "$ftype" in
"$1: Zip archive"*)
  unzip "$1" ;;
"$1: gzip compressed"*)
  gunzip "$1" ;;
"$1: bzip2 compressed"*)
  bunzip2 "$1" ;;
*) error "File $1 can not be uncompressed with smartzip";;
esac
  您可能注意到我们在这里使用了一个特殊的变量$1。该变量包含了传递给该程序的第一个参数值。也就是说,当我们运行:
smartzip articles.zip
$1 就是字符串 articles.zip
  select 表达式是一种bash的扩展应用,尤其擅长于交互式使用。用户可以从一组不同的值中进行选择。
select var in ... ; do
 break
done
.... now $var can be used ....
下面是一个例子:
#!/bin/sh
echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
    break
done
echo "You have selected $var"
下面是该脚本运行的结果:
What is your favourite OS?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#? 1
You have selected Linux
您也可以在shell中使用如下的loop表达式:
while ...; do
....
done
while-loop 将运行直到表达式测试为真。will run while the expression that we test for is true. 关键字"break" 用来跳出循环。而关键字地continue地用来不执行余下的部分而直接跳到下一个循环。
for-loop表达式查看一个字符串列表 (字符串用空格分隔) 然后将其赋给一个变量:
for var in ....; do
 ....
done
在下面的例子中,将分别打印ABC到屏幕上:
#!/bin/sh
for var in A B C ; do
 echo "var is $var"
done
下面是一个更为有用的脚本showrpm,其功能是打印一些RPM包的统计信息:
#!/bin/sh
# list a content summary of a number of RPM packages
# USAGE: showrpm rpmfile1 rpmfile2 ...
# EXAMPLE: showrpm /cdrom/RedHat/RPMS/*.rpm
for rpmpackage in $*; do
 if ;then
  echo "=============== $rpmpackage =============="
  rpm -qi -p $rpmpackage
 else
  echo "ERROR: cannot read file $rpmpackage"
 fi
done
这里出现了第二个特殊的变量$*,该变量包含了所有输入的命令行参数值。如果您运行showrpm openssh.rpm w3m.rpm webgrep.rpm
此时 $* 包含了 3 个字符串,即openssh.rpm, w3m.rpm and webgrep.rpm.
引号
在向程序传递任何参数之前,程序会扩展通配符和变量。这里所谓扩展的意思是程序会把通配符(比如*)替换成合适的文件名,它变量替换成变量值。为了防止程序作这种替换,您可以使用引号:让我们来看一个例子,假设在当前目录下有一些文件,两个jpg文件, mail.jpg 和tux.jpg。
#!/bin/sh
echo *.jpg
这将打印出"mail.jpg tux.jpg"的结果。
引号 (单引号和双引号) 将防止这种通配符扩展:
#!/bin/sh
echo "*.jpg"
echo ’*.jpg’
这将打印"*.jpg" 两次。
单引号更严格一些。它可以防止任何变量扩展。双引号可以防止通配符扩展但允许变量扩展。
#!/bin/sh
echo $SHELL
echo "$SHELL"
echo ’$SHELL’
运行结果为:
/bin/bash
/bin/bash
$SHELL
最后,还有一种防止这种扩展的方法,那就是使用转义字符——反斜杆:
echo *.jpg
echo $SHELL
这将输出:
*.jpg
$SHELL
Here documents
当要将几行文字传递给一个命令时,here documents(译者注:目前还没有见到过对该词适合的翻译)一种不错的方法。对每个脚本写一段帮助性的文字是很有用的,此时如果我们四有那个here documents就不必用echo函数一行行输出。 一个 "Here document" 以 《《 开头,后面接上一个字符串,这个字符串还必须出现在here document的末尾。下面是一个例子,在该例子中,我们对多个文件进行重命名,并且使用here documents打印帮助:
#!/bin/sh
# we have less than 3 arguments. Print the help text:
if ; then
cat 《《HELP
ren -- renames a number of files using sed regular expressions
USAGE: ren ’regexp’ ’replacement’ files...
EXAMPLE: rename all *.HTM files in *.html:
 ren ’HTM$’ ’html’ *.HTM
HELP
 exit 0
fi
OLD="$1"
NEW="$2"
# The shift command removes one argument from the list of
# command line arguments.
shift
shift
# $* contains now all the files:
for file in $*; do
  if ; then
   newfile=`echo "$file" | sed "s/${OLD}/${NEW}/g"`
   if ; then
    echo "ERROR: $newfile exists already"
   else
    echo "renaming $file to $newfile ..."
    mv "$file" "$newfile"
   fi
  fi
done
这是一个复杂一些的例子。让我们详细讨论一下。第一个if表达式判断输入命令行参数是否小于3个 (特殊变量$# 表示包含参数的个数) 。如果输入参数小于3个,则将帮助文字传递给cat命令,然后由cat命令将其打印在屏幕上。打印帮助文字后程序退出。 如果输入参数等于或大于3个,我们就将第一个参数赋值给变量OLD,第二个参数赋值给变量NEW。下一步,我们使用shift命令将第一个和第二个参数从参数列表中删除,这样原来的第三个参数就成为参数列表$*的第一个参数。然后我们开始循环,命令行参数列表被一个接一个地被赋值给变量$file。接着我们判断该文件是否存在,如果存在则通过sed命令搜索和替换来产生新的文件名。然后将反短斜线内命令结果赋值给newfile。这样我们就达到了我们的目的:得到了旧文件名和新文件名。然后使用mv命令进行重命名。
函数
如果您写了一些稍微复杂一些的程序,您就会发现在程序中可能在几个地方使用了相同的代码,并且您也会发现,如果我们使用了函数,会方便很多。一个函数是这个样子的:
functionname()
{
# inside the body $1 is the first argument given to the function
# $2 the second ...
body
}
您需要在每个程序的开始对函数进行声明。
下面是一个叫做xtitlebar的脚本,使用这个脚本您可以改变终端窗口的名称。这里使用了一个叫做help的函数。正如您可以看到的那样,这个定义的函数被使用了两次。
#!/bin/sh
# vim: set sw=4 ts=4 et:
help()
{
  cat 《《HELP
xtitlebar -- change the name of an xterm, gnome-terminal or kde konsole
USAGE: xtitlebar "string_for_titelbar"
OPTIONS: -h help text
EXAMPLE: xtitlebar "cvs"
HELP
  exit 0
}
# in case of error or if -h is given we call the function help:
&& help
&& help
# send the escape sequence to change the xterm titelbar:
echo -e "33]0;$107"
#
  在脚本中提供帮助是一种很好的编程习惯,这样方便其他用户(和您)使用和理解脚本。
  命令行参数
  我们已经见过$* 和 $1, $2 ... $9 等特殊变量,这些特殊变量包含了用户从命令行输入的参数。迄今为止,我们仅仅了解了一些简单的命令行语法(比如一些强制性的参数和查看帮助的-h选项)。但是在编写更复杂的程序时,您可能会发现您需要更多的自定义的选项。通常的惯例是在所有可选的参数之前加一个减号,后面再加上参数值 (比如文件名)。
  有好多方法可以实现对输入参数的分析,但是下面的使用case表达式的例子无遗是一个不错的方法。
#!/bin/sh
help()
{
 cat 《《HELP
This is a generic command line parser demo.
USAGE EXAMPLE: cmdparser -l hello -f -- -somefile1 somefile2
HELP
 exit 0
}
while ; do
case $1 in
  -h) help;shift 1;; # function help is called
  -f) opt_f=1;shift 1;; # variable opt_f is set
  -l) opt_l=$2;shift 2;; # -l takes an argument -》 shift by 2
  --) shift;break;; # end of options
  -*) echo "error: no such option $1. -h for help";exit 1;;
  *) break;;
esac
done
echo "opt_f is $opt_f"
echo "opt_l is $opt_l"
echo "first arg is $1"
echo "2nd arg is $2"
您可以这样运行该脚本:
cmdparser -l hello -f -- -somefile1 somefile2
返回的结果是:
opt_f is 1
opt_l is hello
first arg is -somefile1
2nd arg is somefile2
  这个脚本是如何工作的呢看脚本首先在所有输入命令行参数中进行循环,将输入参数与case表达式进行比较,如果匹配则设置一个变量并且移除该参数。根据unix系统的惯例,首先输入的应该是包含减号的参数。
  实例
  一般编程步骤
  现在我们来讨论编写一个脚本的一般步骤。任何优秀的脚本都应该具有帮助和输入参数。并且写一个伪脚本(framework.sh),该脚本包含了大多数脚本都需要的框架结构,是一个非常不错的主意。这时候,在写一个新的脚本时我们只需要执行一下copy命令:
cp framework.sh myscript
然后再插入自己的函数。
  让我们再看两个例子:
  二进制到十进制的转换
  脚本 b2d 将二进制数 (比如 1101) 转换为相应的十进制数。这也是一个用expr命令进行数学运算的例子:
#!/bin/sh
# vim: set sw=4 ts=4 et:
help()
{
 cat 《《HELP
b2h -- convert binary to decimal
USAGE: b2h binarynum
OPTIONS: -h help text
EXAMPLE: b2h 111010
will return 58
HELP
 exit 0
}
error()
{
  # print an error and exit
  echo "$1"
  exit 1
}
lastchar()
{
  # return the last character of a string in $rval
  if ; then
    # empty string
    rval=""
    return
  fi
  # wc puts some space behind the output this is why we need sed:
  numofchar=`echo -n "$1" | wc -c | sed ’s/ //g’ `
  # now cut out the last char
  rval=`echo -n "$1" | cut -b $numofchar`
}
chop()
{
  # remove the last character in string and return it in $rval
  if ; then
    # empty string
    rval=""
    return
  fi
  # wc puts some space behind the output this is why we need sed:
  numofchar=`echo -n "$1" | wc -c | sed ’s/ //g’ `
  if ; then
    # only one char in string
    rval=""
    return
  fi
  numofcharminus1=`expr $numofchar "-" 1`
  # now cut all but the last char:
  rval=`echo -n "$1" | cut -b 0-${numofcharminus1}`
}
while ; do
case $1 in
  -h) help;shift 1;; # function help is called
  --) shift;break;; # end of options
  -*) error "error: no such option $1. -h for help";;
  *) break;;
esac
done
# The main program
sum=0
weight=1
# one arg must be given:
&& help
binnum="$1"
binnumorig="$1"
while ; do
  lastchar "$binnum"
  if ; then
    sum=`expr "$weight" "+" "$sum"`
  fi
  # remove the last position in $binnum
  chop "$binnum"
  binnum="$rval"
  weight=`expr "$weight" "*" 2`
done
echo "binary $binnumorig is decimal $sum"
#
  该脚本使用的算法是利用十进制和二进制数权值 (1,2,4,8,16,..),比如二进制"10"可以这样转换成十进制:
  0 * 1 + 1 * 2 = 2
  为了得到单个的二进制数我们是用了lastchar 函数。该函数使用wc –c计算字符个数,然后使用cut命令取出末尾一个字符。Chop函数的功能则是移除最后一个字符。
  文件循环程序
  或许您是想将所有发出的邮件保存到一个文件中的人们中的一员,但是在过了几个月以后,这个文件可能会变得很大以至于使对该文件的访问速度变慢。下面的脚本rotatefile 可以解决这个问题。这个脚本可以重命名邮件保存文件(假设为outmail)为outmail.1,而对于outmail.1就变成了outmail.2 等等等等...
#!/bin/sh
# vim: set sw=4 ts=4 et:
ver="0.1"
help()
{
  cat 《《HELP
rotatefile -- rotate the file name
USAGE: rotatefile filename
OPTIONS: -h help text
EXAMPLE: rotatefile out
This will e.g rename out.2 to out.3, out.1 to out.2, out to out.1
and create an empty out-file
The max number is 10
version $ver
HELP
  exit 0
}
error()
{
  echo "$1"
  exit 1
}
while ; do
case $1 in
  -h) help;shift 1;;
  --) break;;
  -*) echo "error: no such option $1. -h for help";exit 1;;
  *) break;;
esac
done
# input check:
if ; then
error "ERROR: you must specify a file, use -h for help"
fi
filen="$1"
# rename any .1 , .2 etc file:
for n in 9 8 7 6 5 4 3 2 1; do
  if ; then
    p=`expr $n + 1`
    echo "mv $filen.$n $filen.$p"
    mv $filen.$n $filen.$p
  fi
done
# rename the original file:
if ; then
  echo "mv $filen $filen.1"
  mv $filen $filen.1
fi
echo touch $filen
touch $filen
  这个脚本是如何工作的呢看在检测用户提供了一个文件名以后,我们进行一个9到1的循环。文件9被命名为10,文件8重命名为9等等。循环完成之后,我们将原始文件命名为文件1同时建立一个与原始文件同名的空文件。
  调试
  最简单的调试命令当然是使用echo命令。您可以使用echo在任何怀疑出错的地方打印任何变量值。这也是绝大多数的shell程序员要花费80%的时间来调试程序的原因。Shell程序的好处在于不需要重新编译,插入一个echo命令也不需要多少时间。
  shell也有一个真实的调试模式。如果在脚本"strangescript" 中有错误,您可以这样来进行调试:
  sh -x strangescript
  这将执行该脚本并显示所有变量的值。
  shell还有一个不需要执行脚本只是检查语法的模式。可以这样使用:
  sh -n your_script
  这将返回所有语法错误。

怎么自己写liunx的shell

在进行linux测试时编写脚本是必不可少的,Shell脚本的名称可以随便定义,也不要什么后缀名,例如可以写abc,smartzip这类名称,运行时只要键入
./smartzip就能运行脚本了。。
每行命令开头处不用就空格也行。。
第1部分. Linux 脚本编写基础
1.1 语法基本介绍
1.1.1 开头
程序必须以下面的行开始(必须方在文件的第一行):
#!/bin/sh
符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。
当好脚本时,如果要执行该脚本,还必须使其可执行。
要使脚本可执行:
编译 chmod +x filename 这样才能用./filename 来运行
1.1.2 注释
在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。
如果您使用了注释,那么即使相当长的时间内没有使用该脚本,您也能在很短的时间内明白该脚本的作用及工作原理。
1.1.3 变量
在其他编程语言中您必须使用变量。在shell编程中,所有的变量都由字符串组成,并且您不需要对变量进行声明。要赋值给一个变量,您可以这样写:
#!/bin/sh
#对变量赋值:
a="hello world"
# 现在打印变量a的内容:
echo "A is:"
echo $a
有时候变量名很容易与其他文字混淆,比如:
num=2
echo "this is the $numnd"
这并不会打印出"this is the 2nd",而仅仅打印"this is the ",因为shell会去搜索变量numnd的值,但是这个变量时没有值的。可以使用花括号来告诉shell我们要打印的是num变量:
num=2
echo "this is the ${num}nd"
这将打印: this is the 2nd
1.1.4 环境变量
由export关键字处理过的变量叫做环境变量。我们不对环境变量进行讨论,因为通常情况下仅仅在登录脚本中使用环境变量。
1.1.5 Shell命令和流程控制
在shell脚本中可以使用三类命令:
1)Unix 命令:
虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。
常用命令语法及功能
echo "some text": 将文字内容打印在屏幕上
ls: 文件列表
wc –l file :计算文件行数
wc -w file:计算文件中的单词数
wc -c file:计算文件中的字符数
cp sourcefile destfile: 文件拷贝
mv oldname newname : 重命名文件或移动文件
rm file: 删除文件
grep ’pattern’ file: 在文件内搜索字符串比如:grep ’searchstring’ file.txt
cut -b colnum file: 指定欲显示的文件内容范围,并将它们输出到标准输出设备比如:输出每行第5个到第9个字符cut -b5-9 file.txt千万不要和cat命令混淆,
这是两个完全不同的命令
cat file.txt: 输出文件内容到标准输出设备(屏幕)上
file somefile: 得到文件类型
read var: 提示用户输入,并将输入赋值给变量
sort file.txt: 对file.txt文件中的行进行排序
uniq: 删除文本文件中出现的行列比如: sort file.txt | uniq
expr: 进行数学运算Example: add 2 and 3expr 2 "+" 3
find: 搜索文件比如:根据文件名搜索find . -name filename -print
tee: 将数据输出到标准输出设备(屏幕) 和文件比如:somecommand | tee outfile
basename file: 返回不包含路径的文件名比如: basename /bin/tux将返回 tux
dirname file: 返回文件所在路径比如:dirname /bin/tux将返回 /bin
head file: 打印文本文件开头几行
tail file : 打印文本文件末尾几行
sed: Sed是一个基本的查找替换程序。可以从标准输入(比如命令管道)读入文本,并将
结果输出到标准输出(屏幕)。该命令采用正则表达式(见参考)进行搜索。不要和shell中的通配符相混淆。比如:将linuxfocus 替换为LinuxFocus :cat text.file | sed ’s/linuxfocus/LinuxFocus/’ 》 newtext.file  awk: awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。
cat file.txt | awk -F, ’{print $1 "," $3 }’这里我们使用,作为字段分割符,同时打印第一个和第三个字段。如果该文件内容如下: Adam Bor, 34, IndiaKerry Miller, 22, USA命令输出结果为:Adam Bor, IndiaKerry Miller, USA
2) 概念: 管道, 重定向和backtick
这些不是系统命令,但是他们真的很重要。
管道 (|) 将一个命令的输出作为另外一个命令的输入。
grep "hello" file.txt | wc -l
在file.txt中搜索包含有”hello”的行并计算其行数。
在这里grep命令的输出作为wc命令的输入。当然您可以使用多个命令。
重定向:将命令的结果输出到文件,而不是标准输出(屏幕)。
》 写入文件并覆盖旧文件
》》 加到文件的尾部,保留旧文件内容。
反短斜线
使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。
命令:
find . -mtime -1 -type f -print
用来查找过去24小时(-mtime –2则表示过去48小时)内修改过的文件。如果您想将所有查找到的文件打一个包,则可以使用以下脚本:
#!/bin/sh
# The ticks are backticks (`) not normal quotes (’):
tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`
3)流程控制
1.if
"if" 表达式 如果条件为真则执行then后面的部分:
if ....; then
....
elif ....; then
....
else
....
fi
大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等…
通常用" "来表示条件测试。注意这里的空格很重要。要确保方括号的空格。
:判断是否是一个文件
:判断/bin/ls是否存在并有可执行权限
:判断$var变量是否有值
:判断$a和$b是否相等
执行man test可以查看所有测试表达式可以比较和判断的类型。
直接执行以下脚本:
#!/bin/sh
if ; then
echo "your login shell is the bash (bourne again shell)"
else
echo "your login shell is not bash but $SHELL"
fi
变量$SHELL包含了登录shell的名称,我们和/bin/bash进行了比较。
快捷操作符
熟悉C语言的朋友可能会很喜欢下面的表达式:
&& echo "This computer uses shadow passwors"
这里 && 就是一个快捷操作符,如果左边的表达式为真则执行右边的语句。
您也可以认为是逻辑运算中的与操作。上例中表示如果/etc/shadow文件存在则打印” This computer uses shadow passwors”。同样或操作(||)在shell编程中也是可用的。这里有个例子:
#!/bin/sh
mailfolder=/var/spool/mail/james
’ ’{ echo "Can not read $mailfolder" ; exit 1; }
echo "$mailfolder has mail from:"
grep "^From " $mailfolder
该脚本首先判断mailfolder是否可读。如果可读则打印该文件中的"From" 一行。如果不可读则或操作生效,打印错误信息后脚本退出。这里有个问题,那就是我们必须有两个命令:
-打印错误信息
-退出程序
我们使用花括号以匿名函数的形式将两个命令放到一起作为一个命令使用。一般函数将在下文提及。
不用与和或操作符,我们也可以用if表达式作任何事情,但是使用与或操作符会更便利很多。
2.case
case :表达式可以用来匹配一个给定的字符串,而不是数字。
case ... in
...) do something here ;;
esac
让我们看一个例子。 file命令可以辨别出一个给定文件的文件类型,比如:
file lf.gz
这将返回:
lf.gz: gzip compressed data, deflated, original filename,
last modified: Mon Aug 27 23:09:18 2001, os: Unix
我们利用这一点写了一个叫做smartzip的脚本,该脚本可以自动解压bzip2, gzip 和zip 类型的压缩文件:
#!/bin/sh
ftype=`file "$1"`
case "$ftype" in
"$1: Zip archive"*)
unzip "$1" ;;
"$1: gzip compressed"*)
gunzip "$1" ;;
"$1: bzip2 compressed"*)
bunzip2 "$1" ;;
*) echo "File $1 can not be uncompressed with smartzip";;
esac
您可能注意到我们在这里使用了一个特殊的变量$1。该变量包含了传递给该程序的第一个参数值。
也就是说,当我们运行:
smartzip articles.zip
$1 就是字符串 articles.zip
3. selsect
select 表达式是一种bash的扩展应用,尤其擅长于交互式使用。用户可以从一组不同的值中进行选择。
select var in ... ; do
break
done
.... now $var can be used ....
下面是一个例子:
#!/bin/sh
echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
break
done
echo "You have selected $var"
下面是该脚本运行的结果:
What is your favourite OS?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#? 1
You have selected Linux
4.loop
loop表达式:
while ...; do
....
done
while-loop 将运行直到表达式测试为真。will run while the expression that we test for is true.
关键字"break" 用来跳出循环。而关键字”continue”用来不执行余下的部分而直接跳到下一个循环。
for-loop表达式查看一个字符串列表 (字符串用空格分隔) 然后将其赋给一个变量:
for var in ....; do
....
done
在下面的例子中,将分别打印ABC到屏幕上:
#!/bin/sh
for var in A B C ; do
echo "var is $var"
done
下面是一个更为有用的脚本showrpm,其功能是打印一些RPM包的统计信息:
#!/bin/sh
# list a content summary of a number of RPM packages
# USAGE: showrpm rpmfile1 rpmfile2 ...
# EXAMPLE: showrpm /cdrom/RedHat/RPMS/*.rpm
for rpmpackage in $*; do
if ;then
echo "=============== $rpmpackage =============="
rpm -qi -p $rpmpackage
else
echo "ERROR: cannot read file $rpmpackage"
fi
done
这里出现了第二个特殊的变量$*,该变量包含了所有输入的命令行参数值。
如果您运行showrpm openssh.rpm w3m.rpm webgrep.rpm
此时 $* 包含了 3 个字符串,即openssh.rpm, w3m.rpm and webgrep.rpm.
5. 引号
在向程序传递任何参数之前,程序会扩展通配符和变量。这里所谓扩展的意思是程序会把通配符(比如*)替换成合适的文件名,它变量替换成变量值。为了防止程序作这种替换,您可以使用引号:让我们来看一个例子,假设在当前目录下有一些文件,两个jpg文件, mail.jpg 和tux.jpg。
1.2 编译SHELL脚本
#ch#!/bin/sh mod +x filename
cho *.jpg ∪缓螅梢酝ü淙耄?./filename 来执行您的脚本。
这将打印出"mail.jpg tux.jpg"的结果。
引号 (单引号和双引号) 将防止这种通配符扩展:
#!/bin/sh
echo "*.jpg"
echo ’*.jpg’
这将打印"*.jpg" 两次。
单引号更严格一些。它可以防止任何变量扩展。双引号可以防止通配符扩展但允许变量扩展。
#!/bin/sh
echo $SHELL
echo "$SHELL"
echo ’$SHELL’
运行结果为:
/bin/bash
/bin/bash
$SHELL
最后,还有一种防止这种扩展的方法,那就是使用转义字符——反斜杆:
echo /*.jpg
echo /$SHELL
这将输出:
*.jpg
$SHELL
6. Here documents
当要将几行文字传递给一个命令时,here documents(译者注:目前还没有见到过对该词适合的翻译)一种不错的方法。对每个脚本写一段帮助性的文字是很有用的,此时如果我们四有那个 here documents就不必用echo函数一行行输出。 一个 "Here document" 以
here document 就是一段特殊目的的代码块. 他使用I/O 重定向的形式来将一个命令序列传递到一个交互程序或者命令中, 比如ftp, cat, 或者ex文本器.
1 COMMAND
limit string 用来划定命令序列的范围(译者注: 两个相同的limit string之间就是命令序列). 特殊符号
而here document 的形式看上去是如下的样子:
1 #!/bin/bash
2 interactive-program
选择一个名字非常诡异的limit string将会避免命令列表和limit string重名的问题.
下面是一个例子,在该例子中,我们对多个文件进行重命名,并且使用here documents打印帮助:
#!/bin/sh
# we have less than 3 arguments. Print the help text:
if ; then
cat
4)函数
如果您写了一些稍微复杂一些的程序,您就会发现在程序中可能在几个地方使用了相同的代码,并且您也会发现,如果我们使用了函数,会方便很多。一个函数是这个样子的:
functionname()
{
# inside the body $1 is the first argument given to the function
# $2 the second ...
body
}
您需要在每个程序的开始对函数进行声明。
下面是一个叫做xtitlebar的脚本,使用这个脚本您可以改变终端窗口的名称。
这里使用了一个叫做help的函数。正如您可以看到的那样,这个定义的函数被使用了两次。
#!/bin/sh
# vim: set sw=4 ts=4 et:
help()
{
cat shift by 2
--) shift;break;; # end of options
-*) echo "error: no such option $1. -h for help";exit 1;;
*) break;;
esac
done
echo "opt_f is $opt_f"
echo "opt_l is $opt_l"
echo "first arg is $1"
echo "2nd arg is $2"
您可以这样运行该脚本:
cmdparser -l hello -f -- -somefile1 somefile2
返回的结果是:
opt_f is 1
opt_l is hello
first arg is -somefile1
2nd arg is somefile2
这个脚本是如何工作的呢?脚本首先在所有输入命令行参数中进行循环,将输入参数与case表达式进行比较,如果匹配则设置一个变量并且移除该参数。根据unix系统的惯例,首先输入的应该是包含减号的参数.
第2部分 实例
现在我们来讨论编写一个脚本的一般步骤。任何优秀的脚本都应该具有帮助和输入参数。并且写一个伪脚本(framework.sh),该脚本包含了大多数脚本都需要的框架结构,是一个非常不错的主意。这时候,在写一个新的脚本时我们只需要执行一下copy命令:
cp framework.sh myscript
然后再插入自己的函数。
让我们再看两个例子:
(1) 二进制到十进制的转换
脚本 b2d 将二进制数 (比如 1101) 转换为相应的十进制数。这也是一个用expr命令进行数学运算的例子:
#!/bin/sh
# vim: set sw=4 ts=4 et:
help()
{
cat
第3部分:调试
最简单的调试命令当然是使用echo命令。您可以使用echo在任何怀疑出错的地方打印任何变量值。这也是绝大多数的shell程序员要花费80%的时间来调试程序的原因。Shell程序的好处在于不需要重新编译,插入一个echo命令也不需要多少时间。
shell也有一个真实的调试模式。如果在脚本"strangescript" 中有错误,您可以这样来进行调试:
sh -x strangescript
这将执行该脚本并显示所有变量的值。
shell还有一个不需要执行脚本只是检查语法的模式。可以这样使用:
sh -n your_script
这将返回所有语法错误
调试shell程序过程
用户刚编写完Shell程序中,不可避免的会有错误,这时我们可以利用Bsh中提供的跟踪选项,该选项会显示刚刚执行的命令及参数。用户可以通过set命令打开-x选项或在启动Shell使用-x选项将Shell设置成跟踪模式。例如有下面代码ice_tx:
if
then
echo "usage:sumints integer list"
exit 1
fi
sum=0
until
do
sum=’expr $sum + $1’
shift
done
echo $sum
我们用跟踪模式运行:
$sh -x ice_tx 2 3 4
结果显示:
+
+sum=0
+
+expr 0+2
+sum=2
+shift
+
+expr 2+3
+sum=5
+shift
+
+expr 5+4
+sum=9
+
+echo 9
9
从上面可以看出,跟踪模式下Shell显示执行的每一条命令以及该命令使用的变量替换后的参数值。一些控制字如if、then、until等没显示。
简单的说,你把你在终端输入的命令放在一个文件里,这个文件就成了shell脚本
比如你一个文件叫 helloworld.sh
内容是
echo "Hello world!"
你把helloword.sh变成可执行的,就是在终端输入
chmod +x helloworld.sh
然后运行
./helloworld.sh
你就成功滴写好了一个shell脚本
一般以
#!/bin/sh
开头(不是必须要写,但一定要单独一行),指定执行这个脚本的shell程序(也可以用#!/bin/zsh或其他),然后就是堆命令了。Linux的shell脚本支持很多功能,加上Linux高度模块化的命令,完全可以用shell脚本写出复杂的程序。
以上只是简单介绍如何开始写shell脚本,如果要写复杂的脚本,还需要深入学习相关知识(如if——fi、case——esac等结构)。
当然,还需要给脚本加上可执行权限(chmod +x ./file.sh),否则可以用
sh ./file.sh
方式执行脚本(这里的sh是执行脚本所需shell,命令也可以是zsh ./file.sh或其他)。

如何用xshell编写脚本

1、在编写shell脚本的时候一般会先查询服务器可以使用哪种脚本,并且查看服务器使用的默认脚本方式是哪一种。
2、进入shell的方式也是linux系统中经常使用的终端工具,也可以是外部链接软件,这两种方式都是可以的。
3、进入终端后可以看到命令行前的提示符为$符号,这代表登录的是普通用户在创建shell脚本,如果命令行是#符号 那就证明是管理员在创建shell脚本,linux系统中权限是比较严谨的。
4、shell脚本的创建也很简单,直接使用vi/vim工具或者其它工具创建即可,后缀一般都是使用.sh为结尾。
5、新建脚本默认所属用户是具有执行权限的,但如果使用其它用户进行执行则需要先授权执行权限。否则其它用户无法执行。

如何编写一个shell脚本

新建一个文件shell脚本一般用×.sh作为后缀当然勇气他的也可以。打开终端输入touch first.sh 新建一个名为first的shell脚本。
编写一个简单的linuxshell脚本
使用vim first.sh也可以用其他的文本器,推荐使用vim
使用命令 vim first.sh打开,输入i进入模式。
编写一个简单的linuxshell脚本
我们写入一个简单的shell脚本,注意第一行的代码解释器的指定,这里使用的是/bin/bash/ 解释器 也可用其他的根据个人情况自己选择。
脚本解释:
echo //显示一串字符并自动换行
read NAME //从屏幕获取一段字符,并赋予NAME
$NAME //取NAME变量的值
# //只用一个#表示注释文本
编写一个简单的linuxshell脚本
文件写完后按下esc键 退出插入模式,接着输入:wq 保存文本并退出文本。
编写一个简单的linuxshell脚本
输入sh + 脚本名称 运行脚本,或给文件可运行权限 chmod +x 然后输入./first.sh运行脚本。

shell脚本书写方法

在shell学习过程中,感觉挺有用的一份比较,略整理分享给大家。

首先,shell的作用
用户的登陆shell 登陆后默认的shell程序是: /bin/bash

不同的shell内部指令,运行环境会有所区别

常见的shell有

/bin/sh

/bin/bash

/sbin/nologin

1.编写脚本代码:

使用vi器,每行一条Linux命令,按照顺序执行

2.然后赋予脚本文件可执行的属性

3.执行脚本文件的三种方法

./chao.sh

sh /chao.sh

source /chao.sh

更完善的脚本构成

注释信息

可执行语句
重定向操作

类型 操作符 用途

重定向输入 《 从指定文件读取而不是从键盘输入

重定向输出 》 将输出文件保存到指定文件(覆盖原有内容)

》》 将输出文件保存到指定文件(覆盖原有内容)

标准错误输出 2》 将错误信息保存到指定的文件(覆盖原有内容)

2》》 将错误信息保存到指定的文件

混合输出 &》 将标准输出,标准错误的内容保存到同一文件中

管道操作符号“|”

将左侧的命令输出结果,作为右侧命令的处理对象
shell变量的作用

为灵活管理Linux系统提供的特定参数,有两层意思

变量名:使用固定的名称,由系统预设或用户定义

变量值: 能够根据用户设置,系统环境的变化而变化

变量的类型

自定义变量:由用户自己定义,修改和使用

环境变量: 由系统维护,用于设置工作环境

位置变量: 通过命令行给脚本程序传递参数

预定义变量:BASH中内置的一类变量,不能直接修改

定义一个新的变量

格式: 变量名=变量值

变量名以字母或下划线开头,区分大小写,建议全大写

查看变量的值: echo $变量名

赋值时使用引号:

双引号:允许使用$符引用其他变量值

单引号: 禁止引用其他变量值,$视为普通字符

反撇号:命令替换,提取命令执行后的输出结果

将键盘输入内容为变量赋值

格式: read 变量名

设置变量的作用范围

export 变量名

export 变量名=变量值

两种格式可以混合使用

整数变量的运算:

expr 变量1 运算符 变量2

常见的运算符

加法运算符 +

减法运算符: -

乘法运算符:\*

除法运算符: /

取余运算:%

整数变量的运算(2)

((变量=变量运算符变量));

等号后面的变量可以是具体数值

例子:

((a=a+3));

环境变量:

由系统提前创建,用来设置用户的工作环境

配置文件: /etc/profile ~/.bash_profile

常见环境变量的举例
位置变量:

表示为$n, n为1~9之间的数字
预定义变量:

/etc/passwd /etc/shadow

例如一些服务的内置用户名或密码

如apache的启动用户就是预定义变量

条件测试操作

测试特定的 表达式是否成立,当条件成立时,测试语句的返回值为0,否则为其他数值

格式 : test 条件表达式
应用实例:
test -z 进行测试的时候 字符串长度为0的时候 结果才返回1

如果变量数值为0 返回0

条件测试操作


部分是判断表达式,-d表示判断是否是目录

&&是”逻辑与“操作符,只有&&前面的判断成立,后面的语句才会执行

-b的意思是判断 后面的路径是否是一个目录

echo $? 表示对刚刚执行的表达式进行判断

0表示成立,1表示不成立

-e filename 如果 filename存在,则为真

-d filename 如果 filename为目录,则为真

-f filename 如果 filename为常规文件,则为真

-L filename 如果 filename为符号链接,则为真

-r filename 如果 filename可读,则为真

-w filename 如果 filename可写,则为真

-x filename 如果 filename可执行,则为真

filename1-nt filename2 如果 filename1比 filename2新,则为真

filename1-ot filename2 如果 filename1比 filename2旧,则为真

字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)

-z string 如果 string长度为零,则为真

-n string 如果 string长度非零,则为真

string1= string2 如果 string1与 string2相同,则为真

string1!= string2 如果 string1与 string2不同,则为真

算术比较运算符

num1-eq num2 等于

num1-ne num2 不等于

num1-lt num2 小于

num1-le num2 小于或等于

num1-gt num2 大于

num1-ge num2 大于或等于

整数值比较

格式:
字符串比较

格式1:



格式2:
逻辑测试:

格式1:

格式2: 命令1 操作符 命令2

if语句的结构
while语句的语法结构

Shell脚本编程实战

做 Java 的肯定都接触过 Linux 系统,那么很多时候我们在开发的过程中都是把我们项目打成一个jar包,或者是war包的形式,然后通过 XFTP 上传到我们服务器的指定目录,然后运行一端启动脚本,让我们的项目变得可以访问 就像 ./sh service.sh start 然后启动我们写好的 sh 的shell脚本。接下来我们就来学习一下关于 Shell 脚本是如何写出来的。

Shell 脚本是什么?Shell是一个命令解释器,它的作用是解释执行用户输入的命令及程序等,也就是说,我们用户每输入一条命令,Shell 就会相对应的执行一条命令。当命令或程序语句不在命令行下执行,而是通过一个程序文件来执行时,该程序文件就被称为Shell脚本。

在我们的 Shell 脚本中,会有各种各样的内容,赋值,计算,循环等一系列的操作,接下来我们就来看看这个 Shell 脚本怎么写吧

1.查看自己当前系统默认的 Shell

echo $SHELL

输出:/bin/bash

2.查看系统支持的Shell

cat /etc/shells

输出:

/bin/sh /bin/bash /usr/bin/sh /usr/bin/bash

也就是说,我们的云服务器是支持我们在这里给他安排 Shell 脚本的

我们这时候先来安排一下 sh 的文件,创建一个文件夹,然后在其中创建一个 sh 的文件。

mkdir /usr/local/shelltest

touch test.sh

创建完成我们一下内容

vim test.sh

然后我们出来运行一下我们的 Shell 的第一个脚本

bash test.sh

出来的结果是 Hello World Shell

一个及其简单的脚本出现了,接下我们就分析一波我们写了点啥?

#!/bin/bash

#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell

我们在之前也使用了 echo $SHELL 来查看了自己系统默认的是哪一种 sh 解析器,之前看到的是/bin/bash,所以我们在写 Shell 脚本的时候,我们在开头默认的约定中,我们写了这个是用 /bin/bash 来进行解释的,

那么我们如何像之前调用我们的当前目录中的 Shell 脚本一样去调用他呢?就像这个样子的 ./sh service.sh start

1.授权,

我们先不授权试一下看看能通过 ./test.sh 进行调用么

bash: ./test.sh: Permission denied 会提示这个,也就是没有授权定义,

授权命令:chmod +x test.sh

2.执行 ./test.sh

然后调用就能正常输出了,就是说,在当前的目录下执行这个脚本命令。

变量命名实际上很简单,我们先来试一下

name=zhiyikeji

这时候我们怎么使用变量呢?实际上只要在前面加上一个符号就可以 $

echo $name

上面的两种写法都是可以的,外面的大括号加和不加区别不大,可以省略,直接就 $name 就可以使用你定义的变量

使用括号的意义一般在于区别某些变量,比如你写了一串的内容,可能写的是 echo $nameismyfriend ,如果连在一起,是不是有点尴尬,这时候就可以使用括号区别一下, echo ${name}ismyfriend 不使用括号的时候,他就去找nameismyfriend这个变量了,就无法出来我们要的效果。

unset name

这时候我们就把我们刚才定义的 name=zhiyikeji 这个变量给去掉了,我们可以调用一下我们的变量看是什么?

echo $name

这是不是就证明我们自己定义的变量已经删除了

那么我们需要一个关键字,大家肯定能想到是什么关键字 readonly

我们先给name赋值,然后使用 readonly 设置只读,然后再改变一下试试,

竟然是真的,如果不设置只读,是不是会重新可以进行赋值,我们测试个年龄,

所以我们就可以肯定,readonly就是设置只读的关键词,记住了么?

那么设置只读的变量可以删除么?毕竟总有杠精的面试官会提问这个棘手的问题,但是,阿粉试过的所有方式好像都是不行的,阿粉就直接重启了自己的服务器,这样临时的变量就不存在了!

说真的,Shell脚本的流程控制数一般才是yyds,为什么这么说,因为你在写大部分的脚本的时候,流程控制的地方永远是最多的,判断,选择,等等一系列的函数,当时熟练使用的时候,就发现这东西确实很有意思。

我们先说最简单的 if else 这也是我们最经常使用的判断,在写 Shell 脚本的时候,就不像我们的 Java 中直接写

Xshell 中的语法就不是这个样子的, Xshell 语法:

末尾的 fi 就是 if 倒过来拼写,我们可以写一个 if 的脚本试一下这个流程能否理解。

这里申明一下,

我们在上面这段脚本中写就是内容就是,我们给脚本传入一个值,然后比对这个值和2的大小关系,然后输出我们指定的内容。

运行后就能看到

$1 表示我们给 Shell 脚本输入的第一个参数, $0 就是你写的shell脚本本身的名字,$2 是我们给 Shell 脚本传的第二个参数

大家在部署某些项目的时候,是不是启动命令就很简洁,就是 sh service.sh start 类似这种的,那我们来看看一般这种是怎么写的,这就用到了另外一块的内容,和 if 类似,在 Java 中也有,那就是 Case .

我们先来看看 Case 的语法,

case ... esac 实际上就和 Java 中的 Case 是非常相似的,case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令. esac 是一个结束的标志。

光说不练,假把式,我们来搞一下试试写一个脚本来搞一下。就用我们刚才说的 sh servic.sh start 来进行测试。

我们来看看运行结果

那么这段 Shell 脚本是什么意思呢?其实很简单,匹配我们传入的第一个字符,和 start 还有 stop 进行比较,如果匹配上之后,输出命令,最后退出即可。

是不是感觉没有那么复杂了呢?

说到流程控制,那么肯定不能不说 for , 毕竟 for 循环在 Java 中那可是重头戏。

我们先看他的格式

那么我们有没有说像是 Java 中那种 for 循环一样的方式呢?比如说这个 for ((i=1; i《=j; i++))

实际上也是支持这种的,我们来写一个试试。

执行一下看看

既然有 for 那是不是就有 while 呢?是的,没错,确实是有 while ,也是循环的意思,但是写法有略微不一样的地方

我们来举个尝试打印九九乘法表来看一下

是不是也挺简单的?

其实 Shell 脚本的编写一般都是在实际应用中提升,单纯的写测试脚本,也是可以让自己对知识的掌握比较充分,而我们一般都是写一些比较简单的脚本,复杂的不是还有运维么?

如何编写一个shell脚本

首先打开编程界面,查看现在dog目录下的文件的权限信息。现在b.txt的用户权限是RW,组权限是RW,其他权限是R。现在我给用户权限加上X运行权限。

新建一个文件shell脚本一般用×.sh作为后缀当然勇气他的也可以。打开终端输入touchfirst.sh新建一个名为first的shell脚本。

在shell脚本中可以使用三类命令:1)Unix命令:虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令。这些命令通常是用来进行文件和文字操作的。

在UNIX/Linux下面编写一个SHELL脚本程序并不难,只要全屏幕程序vi使用得熟练,即可以编写SHELL脚本程序。

SHELL命令编写两个简单的脚本的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于SHELL命令编写两个简单的脚本、SHELL命令编写两个简单的脚本的信息别忘了在本站进行查找哦。

独立编写shell脚本(SHELL命令编写两个简单的脚本)

本文编辑:admin

更多文章:


进制转换的8421法(十进制如何转换成8421码~~请说方法)

进制转换的8421法(十进制如何转换成8421码~~请说方法)

大家好,进制转换的8421法相信很多的网友都不是很明白,包括十进制如何转换成8421码~~请说方法也是一样,不过没有关系,接下来就来为大家分享关于进制转换的8421法和十进制如何转换成8421码~~请说方法的一些知识点,大家可以关注收藏,免

2026年5月11日 00:45

线程和进程的区别是什么 面试(linux进程和线程的区别 面试)

线程和进程的区别是什么 面试(linux进程和线程的区别 面试)

各位老铁们好,相信很多人对线程和进程的区别是什么 面试都不是特别的了解,因此呢,今天就来为大家分享下关于线程和进程的区别是什么 面试以及linux进程和线程的区别 面试的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文

2026年1月20日 03:15

rabbitmq最新版本(rabbitmq3.8.2安装步骤及集群配置)

rabbitmq最新版本(rabbitmq3.8.2安装步骤及集群配置)

今天给各位分享rabbitmq3.8.2安装步骤及集群配置的知识,其中也会对rabbitmq3.8.2安装步骤及集群配置进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录rabbitmq3.8.2安装步骤及集群配

2025年11月21日 11:00

易语言源码打开停止工作(同样一个易语言源码,为什么在我的电脑上运行就卡死,在别人的电脑上运行是正常的)

易语言源码打开停止工作(同样一个易语言源码,为什么在我的电脑上运行就卡死,在别人的电脑上运行是正常的)

其实易语言源码打开停止工作的问题并不复杂,但是又很多的朋友都不太了解同样一个易语言源码,为什么在我的电脑上运行就卡死,在别人的电脑上运行是正常的,因此呢,今天小编就来为大家分享易语言源码打开停止工作的一些知识,希望可以帮助到大家,下面我们一

2026年5月15日 01:30

powershell快捷键打开(windows10的控制面板在哪里找)

powershell快捷键打开(windows10的控制面板在哪里找)

本篇文章给大家谈谈powershell快捷键打开,以及windows10的控制面板在哪里找对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录w

2026年8月7日 07:15

oracle数据库完整性(oracle添加记录的时候提示违反完整性约束,未找到父项关键字怎么解决)

oracle数据库完整性(oracle添加记录的时候提示违反完整性约束,未找到父项关键字怎么解决)

各位老铁们,大家好,今天由我来为大家分享oracle数据库完整性,以及oracle添加记录的时候提示违反完整性约束,未找到父项关键字怎么解决的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力

2025年10月15日 22:30

java找不到工作想去送快递了(昌平北大青鸟分享学Java找不到工作的原因)

java找不到工作想去送快递了(昌平北大青鸟分享学Java找不到工作的原因)

今天给各位分享昌平北大青鸟分享学Java找不到工作的原因的知识,其中也会对昌平北大青鸟分享学Java找不到工作的原因进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录昌平北大青鸟分享学Java找不到工作的原因ja

2026年8月6日 10:45

后台管理系统模板如何使用(开源网店iWeb Shop的模板管理后台怎么操作有什么值得注意的地方)

后台管理系统模板如何使用(开源网店iWeb Shop的模板管理后台怎么操作有什么值得注意的地方)

这篇文章给大家聊聊关于后台管理系统模板如何使用,以及开源网店iWeb Shop的模板管理后台怎么操作有什么值得注意的地方对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录开源网店iWeb Shop的模板管理后台怎么操作有什么值得

2025年10月30日 18:15

高级程序设计语言的主要功能(高级语言的控制结构主要包含什么)

高级程序设计语言的主要功能(高级语言的控制结构主要包含什么)

“高级程序设计语言的主要功能”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看高级程序设计语言的主要功能(高级语言的控制结构主要包含什么)!本文目录高级语言的控制结构主要包含什么用高级程序设计语言编写的程序可读性好,是因为什么

2025年12月8日 19:00

mapreduce的优势(hadoop与传统的关系型数据库(如oracle)相比,有什么优势及劣势)

mapreduce的优势(hadoop与传统的关系型数据库(如oracle)相比,有什么优势及劣势)

大家好,mapreduce的优势相信很多的网友都不是很明白,包括hadoop与传统的关系型数据库(如oracle)相比,有什么优势及劣势也是一样,不过没有关系,接下来就来为大家分享关于mapreduce的优势和hadoop与传统的关系型数据

2026年2月12日 15:00

安卓入门开发(安卓如何 初学者必备的安卓入门指南)

安卓入门开发(安卓如何 初学者必备的安卓入门指南)

今天给各位分享安卓如何 初学者必备的安卓入门指南的知识,其中也会对安卓如何 初学者必备的安卓入门指南进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录安卓如何 初学者必备的安卓入门指南安卓程序开发入门Androi

2025年7月29日 11:15

java交互界面怎么做(北大青鸟java培训:常见交互设计表现形式)

java交互界面怎么做(北大青鸟java培训:常见交互设计表现形式)

大家好,java交互界面怎么做相信很多的网友都不是很明白,包括北大青鸟java培训:常见交互设计表现形式也是一样,不过没有关系,接下来就来为大家分享关于java交互界面怎么做和北大青鸟java培训:常见交互设计表现形式的一些知识点,大家可以

2026年3月23日 04:00

18是什么意思?未满18岁者请勿进入 什么意思

18是什么意思?未满18岁者请勿进入 什么意思

“18”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看18是什么意思?未满18岁者请勿进入 什么意思!本文目录18是什么意思未满18岁者请勿进入 什么意思18是什么意思18这个数字代表:成年、青春。18这个数字代表的含义:十

2026年3月15日 00:15

pull together(pull together是什么意思)

pull together(pull together是什么意思)

各位老铁们,大家好,今天由我来为大家分享pull together,以及pull together是什么意思的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

2026年1月6日 13:30

substantial变形单词(哪些英语单词可以表达 “重要的” 以及它们的区别)

substantial变形单词(哪些英语单词可以表达 “重要的” 以及它们的区别)

这篇文章给大家聊聊关于substantial变形单词,以及哪些英语单词可以表达 “重要的” 以及它们的区别对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录哪些英语单词可以表达 “重要的” 以及它们的区别高中英语选择性必修二单词

2026年1月13日 17:00

持续集成框架(jmeter持续集成为什么要用ant)

持续集成框架(jmeter持续集成为什么要用ant)

各位老铁们好,相信很多人对持续集成框架都不是特别的了解,因此呢,今天就来为大家分享下关于持续集成框架以及jmeter持续集成为什么要用ant的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录jmeter持续集成为什

2025年6月22日 22:15

floor和ceil函数(Math之ceil、floor、round区别)

floor和ceil函数(Math之ceil、floor、round区别)

其实floor和ceil函数的问题并不复杂,但是又很多的朋友都不太了解Math之ceil、floor、round区别,因此呢,今天小编就来为大家分享floor和ceil函数的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

2026年1月22日 22:30

汉化版eclipse(在汉化版eclipse中编写java程序,无法解析start是什么意思)

汉化版eclipse(在汉化版eclipse中编写java程序,无法解析start是什么意思)

各位老铁们好,相信很多人对汉化版eclipse都不是特别的了解,因此呢,今天就来为大家分享下关于汉化版eclipse以及在汉化版eclipse中编写java程序,无法解析start是什么意思的问题知识,还望可以帮助大家,解决大家的一些困惑,

2025年8月6日 22:30

interesting怎么读英语(“interesting”怎么读)

interesting怎么读英语(“interesting”怎么读)

其实interesting怎么读英语的问题并不复杂,但是又很多的朋友都不太了解“interesting”怎么读,因此呢,今天小编就来为大家分享interesting怎么读英语的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧

2026年5月11日 15:45

程序设计语言从机器语言到高级语言的抽象(高级语言的好处)

程序设计语言从机器语言到高级语言的抽象(高级语言的好处)

大家好,程序设计语言从机器语言到高级语言的抽象相信很多的网友都不是很明白,包括高级语言的好处也是一样,不过没有关系,接下来就来为大家分享关于程序设计语言从机器语言到高级语言的抽象和高级语言的好处的一些知识点,大家可以关注收藏,免得下次来找不

2025年11月7日 12:45

近期文章

本站热文

electronics软件(labcenter electronics是什么软件)
2025-05-22 23:45:02 浏览:134
博客是微博吗(博客是微博吗)
2025-05-22 22:45:01 浏览:111
diversity and distribution(悬赏英语短文)
2025-05-23 16:15:02 浏览:107
ios软件开发前景(iOS就业前景怎么样)
2025-05-22 23:00:01 浏览:102
next month(有The next month这个单词吗,和 next month有什么区别)
2025-05-23 02:30:01 浏览:102
patron(patron是什么意思)
2025-05-23 10:30:02 浏览:95
标签列表

热门搜索