Shell编程(脚本)的经常使用命令和语句

一些经常使用的Shell编程(脚本)命令和语句,能够满足一般需求。

接收到的命令參数:

  • 參数个数:

$#

  • 參数值:

命令本身:$0

第一个參数:$1

第二个參数:$2

……

退出命令:

exit

echo命令:

  • 换行:

echo

  • 输出后不换行:

echo -n "请选择(y/n)?"

  • 输出后不换行,并把光标移到最左(以便下次输出覆盖当前行)

echo
-ne "$i\r"

  • 利用转义符号输出双引號:

echo "欢迎使用\"正式server\"部署工具。"

  • 输出中带变量:

echo "即将部署项目:$project_name"

  • 输出带转义符的字符串:

echo -e "first\tsecond"

  • 输出到文件

追加到文件尾:echo -e $log_info >> deploy.log

覆盖文件内容:echo -e $log_info > deploy.log

printf命令:

(能够取代echo。格式化输出。和C语言中的printf函数功能同样)

  • 输出一个小数点后两位的数,并换行:

printf "The number is %.2f.\n" 100

  • 输出一个指定宽度的字符串:

左对齐:printf "%-20s %-15s %10.2f\n" "Stephen" "Liu" 35

右对齐:printf "|%10s|\n" hello

变量:

  • 定义:

profile="production"

  • 使用:

echo $profile

  • 变量拼接:

log_info="$log_info,$target_ip"

数组:

  • 定义:

servers=("192.168.0.31" "192.168.0.39")

projects=("public" "industry" "logistics" "misc")

  • 获得整个数组:

${projects[*]}

  • 获得数组元素个数:

${#servers[@]}

数学运算:

  • 加:x=$(expr "$a" + "$b")
  • 减:x=$(($a - $b))
  • 乘:x=$(expr $a \* $b)
  • 除:x= $(expr $a / $b)

if 语句(条件推断相同适用于while语句和for语句):

  • 推断一个变量(project)是否非空:

if [ $project ];then

echo "Variable \"project\" is null."

fi

  • 推断不等于:

if [ $# -ne 3 ];then

echo "命令行參数不是3个"

fi

注:数值大小推断的一些命令:

gt:大于(greater than)

lt:小于(less than)

eq:等于(equal)

ne:不等于(not equal)

ge:大于等于(greater or equal)

le:小于等于 (less or equal)

  • 布尔值推断:

if [ "$is_ip_correct" = false ];then

echo "无效的ip地址,请使用以下ip之中的一个:"

echo ${servers[*]}

exit

fi

  • 字符串推断:

是否相等:

if [ "$confirm" == "y" ] && [ "$confirm" != "n" ];do

# do something...

fi

是否为空(空返回true): if [-z $string ]

是否非空(非空返回true): if [ -n $string
]

  • 正則表達式推断

if [[ $1 =~ ^public|industry$ ]] && [[ $3 =~ ^[yn]$ ]];then

# do something...

fi

if [[ ! $deploy_more =~ [yn] ]];then

# do something...

fi

  • 推断文件是否存在:

if [ ! -f target/$project.war ];then

# do something...

fi

  • 推断文件夹是否存在:

if [ -d $2/webapps/$1 ];then

# do something...

fi

  • 推断一个文件名称(字符串)的后缀

backup_file="/backup/java_data/$1-$today.war"

backup_file="/backup/java_data/$1-$today.gz"

if [ "${backup_file##*.}" = "war" ];then

cp $backup_file $1.war

elif  [ "${backup_file##*.}" = "gz" ];then

tar zxvf $backup_file

else

echo "备份文件格式不正确"

exit

fi

read 语句(读取用户输入的字符串):

  • 最简单的使用方法:读取用户输入到变量yes_or_no

read yes_or_no

  • 提示用户输入y或n

read -e -p "是否备份:(y/n)?" -i "y" needbackup

(參数说明:-e:不知有什么用,但假设去掉了,-i就失效了。-p:后面接着提示语句。-i:后面接着缺省输入;最后一个參数是保存用户输入的变量。)

select 语句(提示用户从列表中选择一个):

  • 改动默认提示语(默认值是"#?"):

PS3="请选择一个项目:"

  • 提示用户从数组中选择一个值:

select project in ${projects[*]};do

if [ $project ];then

break

fi

done

或加上退出条件:

select target_ip in ${servers[*]} "Exit(退出)";do

if [ "$target_ip" = "Exit(退出)"  ]; then

echo "谢谢使用!Good-Bye!"

break

fi

if [ $target_ip ]; then

# do something

fi

done

case 语句:

case $project in

public)  project_name="大众版" ;;

logistics) project_name="配送版"
;;

misc) project_name="杂项版" ;;

esac

while 语句:

  • 配合正則表達式推断使用:

while [[ ! $needbackup =~ ^[yn]$ ]];do

read -e -p "是否备份:(y/n)?" -i "y" needbackup

done

  • 用“...”做进度条

echo -n "等待$port 端口打开……"

while [ ! $pid_new ];do

#sleep 1

pid_new=`netstat -nlp | grep $port | awk ‘{print $7}‘ | awk -F "/" ‘{print $1}‘`

echo -n "…"

done

for语句:

  • 遍历:

for ip_t in ${servers[*]};do

if [ "$2" = "$ip_t" ];then

is_ip_correct=true

break

fi

done

调用其它程序:

  • 使用``,并获得输出结果:

PS3="请选择一个分支:"

select branch in `svn list svn://<svn_host>/java/code/branches`;do

if [ $branch ];then

svn_dir="svn://<svn_host>/java/code/branches/$branch"

project_dir=$branch

break

fi

done

  • 使用$()。并获得输出结果:

today=$(date +%Y-%m-%d/%H:%M:%S)

svn_version=$(svn info $svn_dir | grep "Last Changed Rev:" | awk ‘{print $4}‘)

  • 无声地调用其它程序(不输出结果,即把结果输出到一个null设备中)

rm $2/logs/m* $2/logs/l* $2/logs/h* $2/logs/catalina.2015* &>/dev/null &

awk(用来对字符串进行切片处理,一般配合grep使用):

  • 获得以空格分隔的第四个字符串:

svn_version=$(svn info $svn_dir | grep "Last Changed Rev:" | awk ‘{print $4}‘)

  • 获得以特殊分隔符("/")分隔的第一个字符串

awk -F "/" ‘{print $1}‘

  • print NF} 和 {print $NF}

    前者是输出了域个数,后者是输出最后一个字段的内容

    如:~# echo $PWD | awk -F/ ‘{print $NF}‘

  • 获取全部端口号为 $port 的进程,并杀掉

for pid in `netstat -nlp | grep $port | awk ‘{print $7}‘ | awk -F "/" ‘{print $1}‘`

do

echo "==========================Warning========================"

echo "无法正常关闭进程,端口:$port,直接kill掉,进程号:$pid"

echo "==========================Warning========================"

kill $pid

done

实例:

1、倒计时:

#!/bin/sh

seconds_left=15

echo "请等待${seconds_left}秒……"
while [ $seconds_left -gt 0 ];do
  echo -n $seconds_left
  sleep 1
  seconds_left=$(($seconds_left - 1))
  echo -ne "\r     \r" #清除本行文字
done
echo "done!"

2、命令运行失败时自己主动重试,直到成功(比方运行svn checkout命令,可能由于网络问题不成功):

svn checkout $svn_dir

while [ ! $? -eq 0 ];do
  echo "重试……"
  svn checkout $svn_dir
done;

echo "done!"

(原创文章,转载请注明转自Clement-Xu的博客:http://blog.csdn.net/clementad/article/details/46793827)

很多其它的使用实例请參考:

http://blog.csdn.net/clementad/article/details/53390888

时间: 2024-12-25 05:24:55

Shell编程(脚本)的经常使用命令和语句的相关文章

shell编程脚本语法

学习了两个月的Linux,记住了很多命令,知道了脚本的作用,也被脚本杀死了大概一半的脑细胞,现在脚本还不能熟练运用,感觉亏了.心疼我的脑细胞,痛恨脚本,但不得不说,脚本是一个好东西啊,用起来真的方便,但是写起来真的烧脑袋呦!下面来总结一下这周学习的脚本语法,哇,语法虽然不多也不难,但是结合起来熟练运用还有一定的难度,何况现在的脚本才几行,以后要写几行,心里没点数吗!废话少说,开始 跳过最基础的命令行堆积的脚本,总结一下让脚本更简洁实用的语法 首先,条件选择if语句登场 if语句用法:常见的单分支

Shell编程(脚本)的常用命令和语句

一些常用的Shell编程(脚本)命令和语句,可以满足一般需求. 接收到的命令参数: 参数个数: $# 参数值: 命令本身:$0 第一个参数:$1 第二个参数:$2 -- 退出命令: exit echo命令: 换行: echo 输出后不换行: echo -n "请选择(y/n)?" 利用转义符号输出双引号: echo "欢迎使用\"正式服务器\"部署工具." 输出中带变量: echo "即将部署项目:$project_name"

shell编程中for/while循环命令

一.for命令 在shell编程中,有时我们需要重复执行一直命令直至达到某个特定的条件,bash shell中,提供了for命令,允许你创建一个遍历一系列值的循环,每次迭代都通过一个该系列中的值执行一组预定义的命令. for的基本格式: for var in list do commands done 在list中,你提供了迭代中要用的一系列值.在每个迭代中,变量var包含列表中的当前值,第一个迭代会适用列表中的第一个值,第二个迭代使用第二个值,以此类推,直至列表中的所有值都过一遍. 1.1读取

shell编程:定义简单标准命令集

shell是用户操作接口的意思,操作系统运行起来后都会给用户提供一个操作界面,这个界面就叫shell,用户可以通过shell来调用操作系统内部的复杂实现,而shell编程就是在shell层次上进行编程,如Linux中的脚本编程. shenll运行原理:由消息接收.解析.执行构成的死循环. 命令行shell:该死循环包含3个模块(命令接收.命令解析.命令执行),命令行有一个标准命令集,用户输入的命令若不是标准命令,则提示用户这不是一个合法命令行,然后重新回到命令行让用户输入下一个命令. 常见的sh

Linux Shell编程笔记一:相关命令

相关出处请查看:http://www.cnblogs.com/stephen-liu74/archive/2011/11/01/2202027.html 零.shell中的内部变量: 1.    $?:    表示shell命令的返回值.2.    $$:    表示当前shell的pid.3.    $!:    最后一个放入后台作业的PID值.4.    $0:    表示脚本的名字.5.    $1--$9,${10}: 表示脚本的第一到九个参数,和第十个参数.6.    $#:    表

shell编程脚本练习题

1.使用for循环在/oldboy目录下通过随机小写10个字母加固定字符串oldboy批量创建10个html文件,名称例如为: [[email protected] oldboy]# sh /server/scripts/oldboy.sh [[email protected] oldboy]# ls coaolvajcq_oldboy.html  qnvuxvicni_oldboy.html  vioesjmcbu_oldboy.html gmkhrancxh_oldboy.html  tmd

Shell编程------脚本范例

1. 批量添加用户 建立用户名和密码组合的txt文件userdata.txt,如下: username1 123 username2 123 username3 123 username4 123 username5 123 username6 123 批量添加以上用户的脚本是: #! /bin/bash while read line do username=$(echo $line | cut -f1 -d' ') #或 username=$(echo $line | awk '{print

shell编程中一些有意思的命令和小技巧

echo -e:启用反斜线控制字符的转换        -E:关闭反斜线控制字符的转换(预设如此)        -n:取消行末之换行符号(与 -e 选项下的 \c 字符同意 -e参数下的控制参数  \a 发出警告声:     \b 删除前一个字符:            \c 最后不加上换行符号:            \f 换行但光标仍旧停留在原来的位置:            \n 换行且光标移至行首:            \r 光标移至行首,但不换行:            \t 插入

3.shell编程-文件查找之find命令

3.1.语法格式 find [路劲][选项][操作] 选项参数对照表 3.2.-name 查找/etc/目录下以.conf结尾的文件 find /etc/ -name "*.conf" -iname   不区分大小写 find /etc/ -iname "*.conf" -user      查找当前目录为root用户的文件 find ./ -user root 3.3.-type 文件的类型 f     文件 d    目录 c    字符设备文件 b    块设

Shell编程中括号判断中赋值语句和判断语句

#!/bin/bash declare var="xxx" # without space and use one = #1.judge whether the assignment statement returns true echo "----------------------test assignment in bracket --------------------------------" [ var="yyyy" ] &&