Jalena Blog

  • 首页
  • 程序开发
    • Java
    • Spring
    • SpringBoot
    • SpringMvc
    • Python
    • Odoo
    • C#
    • SQL
    • Web
    • Linux
  • 移动设备
    • Android
    • BlackBerry
    • Router
  • 杂七杂八
    • 我的废话
    • 音频
    • 视频
    • 常用软件
  • 关于
A bad workman always blames his tools.
  1. 首页
  2. Development
  3. Linux
  4. 正文

Linux Shell 手记

2016-10-16 224点热度 0人点赞 0条评论

下面的例子展示了如何向脚本传递参数、脚本如何获取参数、if else判断、变量的使用等基本内容。

#!/bin/bash
 
# 如果参数个数大于1
if [[ $# -lt 1 ]]; then
	echo "args count must > 1"
	echo "Uage: bash +x example01.sh [args...]"
	exit
fi
 
# 获取传递的参数并赋值给arg
arg=$1
 
if [[ $arg -gt 10 ]]; then
	echo "$arg > 10"
else
	echo "$arg < 10"
fi

这个脚本的调用方式如下:

bash +x example01.sh 5

下面的例子展示了数组、函数、循环等基本使用。

#!/bin/bash
 
if [[ $# -lt 1 ]]; then
	echo "args count must > 1"
	echo "Uage: bash +x example01.sh [args...]"
	exit
fi
 
# 当前命令行所有参数。置于双引号中,表示个别参数
args=$@
 
for arg in $args; do
	echo $arg
done
 
function fun() {
	echo $1
}
 
fun "hello shell"
 
fun2() {
	echo "Linux"
}
 
fun2

注意,函数fun中的$1,获取的是函数参数,不是脚本调用时传入的参数。$@ 是获取脚本调用时传入的参数列表。

while 循环以及其他几种循环、case、表达式expr的使用

#!/bin/bash
 
if [[ $# -lt 1 ]]; then
	echo "args count must > 1"
	echo "Uage: bash +x example01.sh [args...]"
	exit
fi
 
case $1 in
	"install" )
		echo "operation type is install"
	;;
	"uninstall" )
		echo "operation type is uninstall"
	;;
	* )
		echo "operation type is not support"
	;;
esac
 
for ((i=0;i<3;i++))
do
	if ((i==1))
	then
			continue
	fi
	echo $i
done
 
for i in `seq 5`
do
	echo "loop $i"
done

注意这里的case * 并不是所有,而是输入值不在case中,相当于default. 在循环中可以使用continue/break等关键字,非常类似java等其他语言的循环。

脚本之间互相引用

通过source 或者 . 的方式可以引用另一个脚本中的函数或者变量

# first.sh
function fun(){
	echo "i am from first."
}
 
file=first
 
# second.sh
. first.sh # source first.sh
fun
 
echo $file
  • 使用bash +x second.sh执行,在second.sh 中可以调用fun函数和使用file变量。
  • 这里的.和source都可以实现引用first文件中的变量。注意: 如果同时引用了多个脚本的同一个变量名的变量,后面的值会覆盖前面的变量而不会报错。

关于错误处理

  1. 在shell中有一个变量 $? ,这个变量记录的是上次脚本执行的结果,如果正常结束则是0,否则是非0值;
  2. 如果在shell脚本中通过set -o errexit来实现遇到错误就退出,这样能够避免产生更多的错误;
  3. 在shell执行过程中如果出错,可以通过重定向的方式,输出到文件中,比如Command >> filename2>&1

shell中的字典是非常好的数据结构,能够很方便地处理配置

#!/bin/bash
 
set -o errexit
 
hput(){
	eval "hkey_$1"="$2"
}
 
hget(){
	eval echo '${'"hkey_$1"'}'
}
 
hput k1 v1
hget k1
 
declare -A dic
 
dic=([key1]="value1" [key2]="value2" [key3]="value3")
 
echo ${dic["key1"]}
 
# output all key
echo ${!dic[*]}
 
#outpull all value
echo ${dic[*]}
 
# access all
for key in $(echo ${!dic[*]})
do
	echo "$key : ${dic[$key]}"
done

执行之后,输出如下:

v1 value1 key3 key2 key1 value3 value2 value1 key3 : value3 key2 : value2 key1 : value1

文本处理

sed 命令能够对对文本进行操作。

比如有一个文件sedfile,内容如下:

1
2
3
4
5

执行 "sed '1,3d' sedfile,则会输出4,5 两行,即对1,2,3行做了删除处理,注意这时文件里面并没有删掉这两行。

除了删除之外,还可以做替换操作。

root@ubuntu:~/codelab# sed 's/1/0/g' sedfile   
0  
2  
3  
4  
5  
root@ubuntu:~/codelab# cat sedfile   
1  
2  
3  
4  
5

我们发现,在输出时,将1替换成了0;

文本处理还有一个非常强大的工具-awk

我们首先看看awk的基本处理-按照逗号(,)分割获取想要的文本;

root@ubuntu:~/codelab# cat awkfile   
this,is,a,awk,file  
this,is,a,awk,file  
root@ubuntu:~/codelab# cat awkfile | awk -F ',' '{print $0}'  
this,is,a,awk,file  
this,is,a,awk,file  
root@ubuntu:~/codelab# cat awkfile | awk -F ',' '{print $1}'  
this  
this  
root@ubuntu:~/codelab#

这里我们可以看到awk可以按照任意形式分割文本,然后输出;

特殊变量和值

下列变量通常具有固定意义

$# 表示变量的个数,常用于循环
$@ 当前命令行所有参数。置于双引号中,表示个别参数
$* 当前命令行所有参数。置于双引号中,表示将命令行所有参数当初一个单独参数
$-(连字号) 在引用数给予Shell的选项
$? 表示上一个命令退出的状态
$ 表示当前进程编号
$0 表示当前程序名称
$! 表示最近一个后台命令的进程编号
$HOME 表示当前用户根目录
$IFS 表示内部的字段分隔符
$LANG 当前locale默认名称
$PATH 环境变量
$PPID 父进程编号
$PWD 当前工作目录

下列特殊值可以帮助排查问题

0 成功退出
>0 退出失败
1-125 命令退出失败,失败返回的相关值由程序定义(譬如,程序内退出只执行 exit 2,则返回为2)
126 命令找到了,但无法执行
127 命令找不到
>128 命令因受到信号而死亡
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: shell
最后更新:2019-01-22

Jalena

原创内容,转载请注明出处! 部分内容来自网络,请遵守法律适用!

点赞
< 上一篇
下一篇 >

文章评论

取消回复

Jalena

原创内容,转载请注明出处! 部分内容来自网络,请遵守法律适用!

腾讯云
最新 热点 随机
最新 热点 随机
Docker overlay2 清理 & 数据转移 PowerShell 升级 & 增强 Python pip 升级 ESXI & Alpine & Clash Premium 旁路网关 ESXi install Alpine & Clash Proxy 打造自己的Aria2c专属设置 ESXI 升级 Centos 7 离线安装Nginx Centos nmcli 网络管理命令 Linux 密钥登录
PowerShell 升级 & 增强Docker overlay2 清理 & 数据转移
ESXi install Alpine & Clash Proxy AC3 Filter 1.63b MKV工具之mkvtoolnix、MKVExtractGUI 熊猫烧香 - 核心源码 Delphi版本 Wordpress 更换域名 Centos 搭建SVN服务器 Grass Valley Edius Ver.5.50 Postgres 日志分析 Python 转数字为Excel列,转列为数字 Odoo邮件配置
标签聚合
java wordpress 其他 Edius odoo Centos 生活 解码
Links
  • ninja911
  • 猿人学网站
  • ZWWoOoOo
  • Feng Blog
  • 时空镜像
  • Emin.ink

COPYRIGHT © 2021 Jalena Blog. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS