博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shell 脚本基础笔记
阅读量:6313 次
发布时间:2019-06-22

本文共 5679 字,大约阅读时间需要 18 分钟。

这个用来存放我有关Linux的资料。

菜鸟教程学习的一点记录:

准备

这里的 shel l脚本指的 bash 脚本。

如果你新建的是 test.sh,如果想运行这个 sh。你需要执行 ./test.sh而不是 test.sh。 运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去PATH里寻找有没有叫test.sh的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找

Shebang 用来指定,使用那个终端。

#!/bin/bash复制代码

接下来就可以编写你的bash脚本了。

编写你的shell

惯例HelloWorld

#!bin/bashecho "Hello World"复制代码

ps:echo 用于字符串的输出。接下来会讲到

变量的定义

主要就是定义字符串,数字,数组。

your_name="qinjx"echo $your_nameecho ${your_name}复制代码

传递参数

#!/bin/bash# 传递参数实例echo "Shell 传递参数实例!";echo "执行的文件名:$0";echo "第一个参数为:$1";echo "第二个参数为:$2";echo "第三个参数为:$3";# 用于处里字符的参数## 参数处理	 说明# $#	    传递到脚本的参数个数# $*	    以一个单字符串显示所有向脚本传递的参数。#           如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。# $$	    脚本运行的当前进程ID号# $!	    后台运行的最后一个进程的ID号# $@	    与$*相同,但是使用时加引号,并在引号中返回每个参数。#           如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。# $-	    显示Shell使用的当前选项,与set命令功能相同。# $?	    显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。##echo "参数个数为:$#";echo "传递的参数作为一个字符串显示:$*";# $* 与 $@ 区别:# 相同点:都是引用所有参数。# 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。echo "-- \$* 演示 ---"for i in "$*"; do    echo $idoneecho "-- \$@ 演示 ---"for i in "$@"; do    echo $idone复制代码

执行结果:

数组

#!/bin/bash# my_array[0]=A# my_array[1]=B# my_array[2]=C# my_array[3]=Dmy_array=(A B "C" D)echo "第一个元素为: ${my_array[0]}"echo "第二个元素为: ${my_array[1]}"echo "第三个元素为: ${my_array[2]}"echo "第四个元素为: ${my_array[3]}"# get all itemecho "数组的元素为: ${my_array[*]}"echo "数组的元素为: ${my_array[@]}"# get array lengthecho "数组元素的长度为: ${#my_array[*]}"echo "数组元素的长度为: ${#my_array[@]}"复制代码

执行结果:

printf

#!/bin/bash# printf 命令模仿 C 程序库(library)里的 printf() 程序。# 标准所定义,因此使用printf的脚本比使用echo移植性好。# printf 使用引用文本或空格分隔的参数,外面可以在printf中使用格式化字符串,还可以制定字符串的宽度、# 左右对齐方式等。默认printf不会像 echo 自动添加换行符,我们可以手动添加 \n。# %s %c %d %f都是格式替代符# %-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。# %-4.2f 指格式化为小数,其中.2指保留2位小数。printf "%-10s % -8s %-4s\n" 姓名 性别 体重kgprintf "%-10s % -8s %-4.2f\n" 郭靖 男 66.7865# format-string为双引号printf "%d %s\n" 1 "abc"# 单引号与双引号效果一样printf '%d %s\n' 1 "abc"# 没有引号也可以输出printf %s abcdef# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用printf %s abc defprintf "%s\n" abc defprintf "%s %s %s\n" a b c d e f g h i j# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替printf "%s and %d \n"复制代码

test

#!/bin/bash#数值测试# -eq	等于则为真# -ne	不等于则为真# -gt	大于则为真# -ge	大于等于则为真# -lt	小于则为真# -le	小于等于则为真num1=100num2=200if test $[num1] -eq $[num2]then  echo '两个数相等1'else  echo '两个数不相等'fi#字符串测试# =	        等于则为真# !=        不相等则为真# -z 字符串	字符串的长度为零则为真# -n 字符串	字符串的长度不为零则为真str1="kaka08"str2="kaka22"if test $str1 = $str2then  echo "两个字符串相等"else  echo "两个字符串不相等"fi#文件测试# -e 文件名	如果文件存在则为真# -r 文件名	如果文件存在且可读则为真# -w 文件名	如果文件存在且可写则为真# -x 文件名	如果文件存在且可执行则为真# -s 文件名	如果文件存在且至少有一个字符则为真# -d 文件名	如果文件存在且为目录则为真# -f 文件名	如果文件存在且为普通文件则为真# -c 文件名	如果文件存在且为字符型特殊文件则为真# -b 文件名	如果文件存在且为块特殊文件则为真cd /binif test -e ./bashthen    echo '文件已存在!'else    echo '文件不存在!'fi# 另外,Shell还提供了与( -a )、或( -o )、非( ! )三# 个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低。例如cd /binif test -e ./notFile -o -e ./bashthen    echo '有一个文件存在!'else    echo '两个文件都不存在'fi复制代码

流程控制

#!/bin/bash# if condition# then#     command1#     command2#     ...#     commandN# fi# 写成一行(适用于终端命令提示符):# if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi# if condition1# then#     command1# elif condition2# then#     command2# else#     commandN# fia=10b=20if [ $a == $b ]then   echo "a 等于 b"elif [ $a -gt $b ]then   echo "a 大于 b"elif [ $a -lt $b ]then   echo "a 小于 b"else   echo "没有符合的条件"fi# for 循环# 与其他编程语言类似,Shell支持for循环。# for循环一般格式为:# for var in item1 item2 ... itemN# do#     command1#     command2#     ...#     commandN# donefor loop in 1 2 3 4 5 6do  echo "The vlue is: $loop"done# while 语句# while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:# while condition# do#     command# doneint=1while(($int<=5))do  echo $int  let "int++"done# 使用中使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量,具体可查阅:Bash let 命令# 。# while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按
结束循环。# echo '按下
退出'# echo -n '输入你最喜欢的电影名: '# while read FILM# do# echo "是的!$FILM 是一部好电影"# done# Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:# case 值 in# 模式1)# command1# command2# ...# commandN# ;;# 模式2)# command1# command2# ...# commandN# ;;# esac# case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。# 取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。# 下面的脚本提示输入1到4,与每一种模式进行匹配:echo '输入 1 到 4 之间的数字:'echo '你输入的数字为:'read aNumcase $aNum in 1) echo '你选择了 1' ;; 2) echo '你选择了 2' ;; 3) echo '你选择了 3' ;; 4) echo '你选择了 4' ;; *) echo '你没有输入 1 到 4 之间的数字' ;;esac复制代码

function

#!/bin/bash#sampledemoFun(){  echo "这是一个函数"}echo "---------函数开始运行----------"demoFunecho "---------函数运行完毕----------"#returnfunWithReturn(){    echo "这个函数会对输入的两个数字进行相加运算..."    echo "输入第一个数字: "    read aNum    echo "输入第二个数字: "    read anotherNum    echo "两个数字分别为 $aNum 和 $anotherNum !"    return $(($aNum+$anotherNum))}funWithReturnecho "输入的两个数字之和为 $? !"#传递参数funWithParam(){    echo "第一个参数为 $1 !"    echo "第二个参数为 $2 !"    echo "第十个参数为 $10 !"    echo "第十个参数为 ${10} !"    echo "第十一个参数为 ${11} !"    echo "参数总数有 $# 个!"    echo "作为一个字符串输出所有参数 $* !"}funWithParam 1 2 3 4 5 6 7 8 9 34 73# 注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。复制代码

输入/输出重定向

地址:http://www.runoob.com/linux/linux-shell-process-control.html

文件包含

格式:

. filename   # 注意点号(.)和文件名中间有一空格或source filename复制代码

实例:

test1.sh

#!/bin/bashurl="http://www.runoob.com"复制代码

test2.sh

#!/bin/bash#使用 . 号来引用test1.sh 文件. ./test1.sh# 或者使用以下包含文件代码# source ./test1.shecho "菜鸟教程官网地址:$url"复制代码

转载地址:http://mdrxa.baihongyu.com/

你可能感兴趣的文章
Richard M. Stallman 给《自由开源软件本地化》写的前言
查看>>
oracle数据库密码过期报错
查看>>
修改mysql数据库的默认编码方式 .
查看>>
zip
查看>>
How to recover from root.sh on 11.2 Grid Infrastructure Failed
查看>>
rhel6下安装配置Squid过程
查看>>
《树莓派开发实战(第2版)》——1.1 选择树莓派型号
查看>>
在 Linux 下使用 fdisk 扩展分区容量
查看>>
结合AlphaGo算法和大数据的量化基本面分析法探讨
查看>>
如何在 Ubuntu Linux 16.04 LTS 中使用多个连接加速 apt-get/apt
查看>>
《OpenACC并行编程实战》—— 导读
查看>>
机器学习:用初等数学解读逻辑回归
查看>>
Oracle原厂老兵:从负面案例看Hint的最佳使用方式
查看>>
把自己Github上的代码添加Cocoapods支持
查看>>
C语言OJ项目参考(2493)四则运算
查看>>
零基础入门深度学习(二):神经网络和反向传播算法
查看>>
find和xargs
查看>>
数据结构例程—— 交换排序之快速排序
查看>>
WKWebView代理方法解析
查看>>
IOS定位服务的应用
查看>>