Linux命令行和shell脚本编程宝典 Richard Blum

第一个脚本文件


代码如下:

#!/bin/bash
echo "This is my first bash code!"
exit 0

重定向符号和数学计算


代码如下:

#!/bin/bash
echo -n "The time and date are: "
date
value1=100  #等号前后不允许出现空格
value2=$value1
echo -n "value1="
echo $value1
echo -n "value2="
echo $value2
ls -l | sort > out.txt   #管道符号(|)和重定向输出符号>
ls -l >> out.txt   #重定向追加输出符号>>
echo -n  "wc<out.txt:"
wc < out.txt  #重定向输入符号<
echo "sort<<EOF ... EOF"
sort << EOF  #内置输入重定向<<
`date`
EOF
#数学计算
echo -n "expr进行计算:1+5="
expr 1+5
echo -n "使用方括号进行计算:1+5="
echo $[1+5]
echo "使用bc计算器进行浮点运算"
var1=100
var2=200
var3=`echo "scale=4;$var1/$var2" | bc`
echo "$var1 / $var2 = $var3"
var4=71
var5=`bc<<EOF
scale=4
a1=($var1*$var2)
b1=($var3*$var4)
a1+b1
EOF`
echo "var5=$var5"
exit 0

使用test命令


代码如下:

#!/bin/bash
#使用test命令
var1=10
var2=100
if [ $var1 -gt $var2 ]
then
    echo "var1 grate var2"
else
    echo "var2 grate var1"
fi
#只能比较整数
test_user=hanxi
if [ $USER = $test_user ]
then
    echo "Welcome $test_user"
fi
str1=Hanxi
str2=hanxi
if [ $str1 \> $str2 ]
then
    echo "$str1 > $str2"
else
    echo "$str1 < $str2"
fi
if [ -n $str1 ]
then
    echo "The string '$str1' is not empty"
else
    echo "the string '$str1' is empty"
fi
#检查文件目录
if [ -d $HOME ]
then
    echo "your Home dir exists"
    cd $HOME
    ls -a
else
    echo "there's a problem with your HOME dir"
fi
pwfile=/etc/shadow
if [ -f $pwfile ]
then
    if [ -r $pwfile ]
    then
        tail $pwfile
    else
        echo "Sorry, I'm unable to reas the $pwfile file "
    fi
else
    echo "Sorry, the file $pwfile doesn't exist"
fi
if [[ $USER == h* ]]
then
    echo "Hello $USER"
else
    echo "Sorry, I don't know you"
fi

循环语句


代码如下:

#!/bin/bash
for file in /home/hanxi/*
do
    if [ -d "$file" ]
    then
        echo "$file is a directory"
    elif [ -f "$file" ]
    then
        echo "$file is a file"
    fi
done
var1=10
while [ $var1 -gt 0 ]
do
    echo $var1
    var1=$[ $var1 - 1 ]
done
var1=100
until [ $var1 -eq 0 ]
do
    echo $var1
    var1=$[ $var1 - 25 ]
done
#文件数据的循环
IFSOLD=$IFS
IFS=$'\n'
for entry in `cat /etc/passwd`
do
    echo "Values in $entry -"
    IFS=:
    for value in $entry
    do
        echo " $value"
    done
done | more
for file in /home/hanxi/*
do
    if [ -d "$file" ]
    then
        echo "$file is directory"
    elif
        echo "$file is a file"
    fi
done > output.txt

读取参数


代码如下:

#!/bin/bash
name=`basename $0`
echo the commane entered is : $name
c_args=$#
echo count args:$c_args
#取最后一个参数
echo the last parameter is ${!#}
echo all parameter: $*
echo all parameter: $@
count=1
for param in "$@"
do
    echo "\$@ parameter #$count = $param"
    count=$[ $count + 1 ]
done
#getopts
while getopts :ab:c opt
do
    case "$opt" in
    a) echo "Found the -a option";;
    b) echo "Found the -b option, with value $OPTARG";;
    c) echo "Found the -c option";;
    *) echo "Unknown option : $opt";;
    esac
done
shift $[ $OPTIND - 1 ]
count=1
for param in "$@"
do
    echo "Parameter $count: $param"
    count=$[ $count + 1 ]
done
read -p "Please enter your age:" age
echo age:$age
if read -t 5 -p "Please enter your name: " name
then
    echo "Hellp $name,welcome to my script"
else
    echo
    echo "sorry ,too slow!"
fi
read -n1 -p "Do you want to continue [Y/N]?" answer
case $answer in
Y | y) echo
       echo " fine, continue on...";;
N | n) echo
       echo OK,Good bye
       exit;;
esac
echo "This is the end of the script"
read -s -p "Enter your password: " pass
echo
echo "Is your password really $pass?"
#读取文件
count=1
cat for.txt | while read line
do
    echo "Line $count: $line"
    count=$[ $count+1 ]
done
echo "Finished processing the file"

重定向文件描述符


代码如下:

#!/bin/bash
#永久重定向
exec 9>&2
exec 2>testerror
echo "this will in testerror">&2
exec 2<&9
exec 9<&0
exec 0<testin
count=1
while read line
do
    echo "Line #$count:$line"
    count=$[ $count + 1 ]
done
exec 0<&9
#重定向文件描述符
exec 3>&1
exec 1>testout
echo "this should store in the output file"
echo "along with this line."
exec 1>&3
echo "Now things should be back to nomarl"
exec 4<&0
exec 0<testin
count=1
while read line
do
    echo "Line #$count:$line"
    count=$[ $count + 1 ]
done
exec 0<&4
read -p "Are you done now?" answer
case $answer in
Y|y) echo "Goodbye";;
N|n) echo "continue...";
esac
#创建读写文件描述符
exec 8<> testfile
read line <&8
echo "Read:$line"
echo "This is a test line" >&8
#关闭文件描述符
exec 8>&-
#列出文件描述服
#`/usr/sbin/lsof -a -p $$`|more
#禁止命令输出
#2 > /dev/null
#创建本地临时文件
tempfile=`mktemp test.XXXXXX`
exec 4>$tempfile
echo "This is the first line">&3
exec 4>&-
#在/temp中创建临时文件
tmpfile=`mktemp -t tmp.XXXXXX`
echo "The temp file is located at:$tempfile"
cat $tempfile
rm -f $tempfile
#创建临时文件夹
tmpdir=`mktemp -d dir.XXXXXX`
cd $tmpdir
tempfile1=`mktemp temp.XXXXXX`
ls -l
cd ..
#记录消息
a=`date | tee testfile;\
cat testfile;\
date | tee -a testfile;\
cat testfile`

信号处理


代码如下:

#!/bin/bash
#信号处理
trap "echo 'get a sign'" SIGINT SIGTERM
trap "echo byebye" EXIT
echo "This is a test program"
count=1
while [ $count -le 10 ]
do
    echo "Loop #$count"
    sleep 10
    count=$[ $count+1 ]
done
echo "This is the end of the test program"
trap - EXIT#移除捕获
#后台牧师运行
#./test6.sh &
#不使用终端的情况下运行脚本
#nohup ./test6.sh &
#查看作业
#jobs
#重新启动作业
#bg 2(作业序号)//后台
#fg 2//前台
#优先级
#nice -n 10 ./test6.sh
#renice 10 -p 25904(进程号)
#预计时间运行at命令
#at -f test6.sh 20:00
#batch命令,系统平均负载低于0.8时运行,可以设定时间,比at命令更好
#corn表格可以设定循环运行,格式:
#min hour dayofmonth month dayofweek command
#每个月第一天运行:
#12 16 * * 1 command
#每个月最后一天运行:
#12 16 * * * if [ `date +%d =d tommorrow` = 01 ] ; then ; command

函数的使用


代码如下:

#!/bin/bash
#函数
#使用返回值
function func1
{
    read -p "Enter a value: " value
    echo $[ $value * 2 ]
}
result=`func1`
echo "the new value is $result"
#传递参数
function func2
{
    echo $[ $1+$2 ]
}
result=`func2 2 2`
echo "the new result is $result"
#局部变量, 递归
function func3
{
    if [ $1 -eq 1 ]
    then
        echo 1
    else
        local temp=$[ $1-1 ]
        local result=`func3 $temp`
        echo $[ $result*$1 ]
    fi
}
read -p "Enter value:" value
result=`func3 $value`
echo "the factorial of $value is: $result"
#调用当前目录下到函数库
#. ./myfuncs

(0)

相关推荐

  • Linux Shell脚本系列教程(二):终端打印命令详解

    终端打印 终端是交互式工具,用户可以通过它与shell环境进行交互.在终端中打印文本是大多数shell脚本和工具日常需要执行的基本任务.通过终端打印,人们可以知道系统的运行状态,这对用户来说是至关重要的. echo终端打印 复制代码 代码如下: echo "Welcome to Bash" echo 'Welcome to Bash' echo  Welcome to Bash 以上三种方法的效果是一样的,输出内容都是"Welcome to Bash",并在末尾添加

  • linux awk时间计算脚本及awk命令详解

    在linux如果计划时间是个麻烦事, 用awk脚本如下 BEGIN {FS=":";OFS=":"} {total_seconds=total_seconds+$3} total_seconds>=60 {total_seconds=total_sconds-60 $2=$2+1 } {total_minutes=total_minutes+$2 $2=$2+1 } {total_minutes=total_minutes+$2} total_minutes&

  • Linux下Shell脚本中几种基本命令的替换区别

    Part 1 : ` command ` 这是 "命令标准输出作为函数标准输入" 操作方法之一,有很大的弊端以及不安全的地方. 缺点一:比较陈旧. 缺点二:容易与单引号混淆.(其实它是你键盘"!"左边那个键) Part 1.5 ` command``与 $(command) 俩者区别 直接看几张图吧,看这图解释他们区别... 大家可以看到俩种表达方式,分别是代表命令直接执行和嵌套执行. 我们发现:执行`` 和 $() 是相同的. 附,其实这里有个小bug...( 橙

  • python脚本内运行linux命令的方法

    本文实例讲述了python脚本内运行linux命令的方法.分享给大家供大家参考.具体实现方法如下: #/usr/bin/env python import subprocess class RunCmd(object): def cmd_run(self, cmd): self.cmd = cmd subprocess.call(self.cmd, shell=True) #Sample usage a = RunCmd() a.cmd_run('ls -l') 希望本文所述对大家的Python

  • linux命令详解date使用方法(计算母亲节和父亲节日期脚本示例)

    常用参数格式:date显示当前日期时间. 格式:date mmddHHMM           # 简而言之,就是"月日时分"格式:date mmddHHMMYYYY格式:date mmddHHMM.SS格式:date mmddHHMMYYYY.SS设置当前日期时间,只有root用户才能执行,执行完之后还要执行 clock -w 来同步到硬件时钟.mm为月份,dd为日期,HH为小时数,MM为分钟数,YYYY为年份,SS为秒数. 格式:date +FORMAT根据指定格式显示当前时间.比

  • 详解如何在 Linux 启动时自动执行命令或脚本

    我一直很好奇,在启动 Linux 系统并登录的过程中到底发生了什么事情.按下开机键或启动一个虚拟机,你就启动了一系列事件,之后会进入到一个功能完备的系统中,有时,这个过程不到一分钟.当你注销或者关机时,也是这样. 更有意思的是,在系统启动以及用户登录或注销时,还可以让系统执行特定的操作. 本文,我们将探讨一下在 Linux 操作系统中实现这些目标的传统方法. 注意:我们假定使用的是 Bash 作为登录及注销的主 Shell.如果你使用的是其他 Shell,那么有些方法可能会无效.如果有其他的疑问

  • linux shell脚本学习xargs命令使用详解

    xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理.通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从文件的输出中读取数据.xargs的默认命令是echo,这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代. xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令,下面是一些如何有效使用xargs 的实用例子. 1.

  • 如何通过Linux命令行使用和运行PHP脚本

    下面通过图文并茂的方式给大家分享下通过Linux命令使用和运行PHP脚本. PHP是一个开源服务器端脚本语言,最初这三个字母代表的是"Personal Home Page",而现在则代表的是"PHP:Hypertext Preprocessor",它是个递归首字母缩写.它是一个跨平台脚本语言,深受C.C++和Java的影响. 在 Linux 命令行中运行 PHP 代码 PHP的语法和C.Java以及带有一些PHP特性的Perl变成语言中的语法十分相似,它当下大约正被

  • Linux命令行和shell脚本编程宝典 Richard Blum

    第一个脚本文件 复制代码 代码如下: #!/bin/bashecho "This is my first bash code!"exit 0 重定向符号和数学计算 复制代码 代码如下: #!/bin/bashecho -n "The time and date are: "datevalue1=100  #等号前后不允许出现空格value2=$value1echo -n "value1="echo $value1echo -n "val

  • Linux Shell 脚本编程入门教程

    从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操作.在Linux GUI日益完善的今天,在系统管理等领域,Shell编程仍然起着不可忽视的作用.深入地了解和熟练地掌握Shell编程,是每一个Linux用户的必修 功课之一. Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh).Bourne

  • Shell脚本编程30分钟入门(小结)

    什么是Shell脚本 Shell脚本(英语:Shell script),又称Shell命令稿.程序化脚本,是一种电脑程序与文本文件,内容由一连串的shell命令组成,经由Unix Shell直译其内容后运作.被当成是一种脚本语言来设计,其运作方式与直译语言相当,由Unix shell扮演命令行解释器的角色,在读取shell脚本之后,依序运行其中的shell命令,之后输出结果.利用shell脚本可以进行系统管理,文件操作等. 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell

  • Linux 下使用shell脚本定时维护数据库的案例

    疫情期间哪哪也不能在,天天在家宅着快闷出病了,今天跟着韩顺平老师的视频学了一个星期的Linux基础命令和shell编程之后,做了一个shell脚本定时维护数据库的案例,用于之后复习和应用. 脚本需求如下: #数据库定时备份 #备份路径 BACKUP=/data/backup/db #获取当前时间作为文件名 DATETIME=$(date +%Y_%m_%d_%H%M%S) echo "=开始备份=" echo '备份的路径是 BACKUP/BACKUP/BACKUP/DATETIME.

  • shell脚本编程Makefile的使用

    目录 为什么要使用Makefile Makefile的编写 Make工作原理 Makefile的规则 为什么要使用Makefile 简单来说,当我们写一个稍微大一些项目的时候,如果我们要执行一个程序那得编译很多个文件并且还得链接起来,如果没有Makefile我们就得一个一个编译一个一个链接那真的是又臭又长(而且还会经常写错),而Makefile就能够很好的解决这个问题,所以说掌握好Makefile的编写是很有必要的 Makefile的编写 程序的编译和链接 使用C.C++编写可执行程序,首先要把

  • Linux下使用Shell脚本获取终端宽度的解决方法

    获取终端大小时候的学习 在写shell脚本时想输出一行占满整个终端屏幕宽度的 横杠 发现for循环会导致执行缓慢 解决方法: 使用yes 命令 sed '50q' 显示50行 tr -d '\n' 删除 \n 多次重复输入相同字符可用yes yes "2" | sed '50q' | tr -d '\n' 想法来自:打印100个连续的符号,不用循环 ---------------------------------------------------------------------

  • 分享一个可以通过命令简写执行对应命令的Shell脚本

    本篇文章介绍一个可以通过命令简写执行对应命令的 shell 脚本. 假设这个 shell 脚本的名称为 tinyshell.sh. 在 Linux 下进行项目开发,经常会用到一些调试开发命令. 这些命令可能比较长,需要输入多个字符. 例如,Android 系统抓取全部 log 并包含 log 时间的命令是 adb logcat -b all -v threadtime. 抓取 log 是调试开发非常常见的操作,这个命令又很长,输入起来不方便. 为了简化输入,可以配置一些命令简写来对应比较长命令.

  • Linux中自定义shell脚本启动jar包的方法

    一键启动.停止.重启 java项目 创建.sh文件 vi XXX.sh 编写shell脚本 #!/bin/sh port=8080 #定义变量等号左右不能有空格 jar_name=/opt/oaclou/XXX.jar #运行脚本提示信息 tips(){ echo "-------------------------------------" echo "" echo "项目端口: ${port}" echo "项目地址: ${jar_

  • 如何利用 tee 命令调试shell脚本中的管道

    目录 实例 执行脚本 问题 原因 验证 总结 实例 下面是一个简单的脚本,脚本中 processid 函数的作用是查询指定进程名字的进程ID,在管理linux服务器的过程中,这个是很常见的功能,processid 函数作用是利用多层管道命令查询进程ID,以下是测试脚本源码 #!/bin/sh processid() { ipid=$(ps -ef | grep -w $1 | grep -v grep | awk '{print $2}') echo $ipid } case "$1"

  • Linux下使用shell脚本自动执行脚本文件

    以下实例本人在Centos6.5 64位操作系统中使用 一.定时复制文件 a.在/usr/local/wfjb_web_back目录下创建 tomcatBack.sh文件 文件内容: #将tomcat中的应用wfjb_web 复制到 /usr/local/wfjb_web_back/tomcat_back/目录下 并按照日期作为文件名称 cp -af /usr/local/apache-tomcat-7.0.73/webapps/wfjb_web /usr/local/wfjb_web_back

随机推荐