bash脚本记录,基本够用了

服务器要到期了,记录的bash脚本先搬过来存一下,日后再好好整理。

#! /bin/bash

#chmod +x test.sh可以加上可执行权限
#三种执行方式 (./xxx.sh bash xxx.sh . xxx.sh)
# ./xxx.sh :先按照 文件中#!指定的解析器解析
# 如果#!指定指定的解析器不存在 才会使用系统默认的解析器

# bash xxx.sh:指明先用bash解析器解析
# 如果bash不存在 才会使用默认解析器

# . xxx.sh 直接使用默认解析器解析(不会执行第一行的#!指定的解析器)但是第一行还是要写的


## 若Windows编写的脚本不能运行
# 将windows文件 转换成 unix文件
# 方法一:dos2unix 如果没有该插件 需要安装
# sudo apt-get install dos2unix
# dos2unix shell脚本
# 转换成功就可以执行运行
# 方法二:
# 需要用vi打开脚本,在最后一行模式下执行
# :set ff=unix

##变量
#声明变量并赋值,unset清除变量值
# num=10
# echo $num
# unset num
# echo $num

#数组
#使用圆括号,元素用空格分开
# arr=("v1" "v2" "v3" "v4")
#或者下标赋值也可以
# arr[0]="a"
# arr[1]="b"

# #下表读取元素
# arr=("v1" "v2" "v3" "v4")
# echo "${arr[0]}"
# echo "${arr[2]}"

# #输出数组所有元素
# arr=("v1" "v2" "v3" "v4")
# echo "数组的元素为: ${arr[*]}"
# echo "数组的元素为: ${arr[@]}"

#输出数组的长度
# arr=("v1" "v2" "v3" "v4")
# echo "数组元素个数为: ${#arr[*]}"
# echo "数组元素个数为: ${#arr[@]}"

# #遍历数组元素
# arr=("v1" "v2" "v3" "v4")
# for i in ${arr[*]}
# do
#   echo $i
# done


#输入
# read -p "输入值:" num
# echo $num

#只读变量
# readonly num=-1
# num=1 # 报错,不让修改

#变量导出,可以被其他shell脚本识别并无需导入直接通过$符号使用(需要在终端执行:source 脚本文件名)
# export MY_ENV_P="NNN" #在终端执行source test.sh,再执行env,输出内容就有MY_ENV_P这变量,其他shell文件可直接通过$MY_ENV_P来使用


#数字和字符串是一样的???可以测试一下输入
# echo "参数的个数=$#"
# echo "参数的内容=$*"
# echo "第1个参数=$1"
# echo "第2个参数=$2"
# echo "第3个参数=$3"

# readonly data=250
# echo "data=250的结果:$?"
# echo "进程名:$0"
# echo "进程号:$$"


##脚本变量特殊用法,双引号、单引号、转义、()、{}

# echo "今天是:`date`"
# echo -e "##\n##"


# data=10
# # ()开启一个子shell,里面的读写不影响外部(当前)的shell变量
# (
#   data=100
#   echo "()里面的data=$data"
# )
# echo $data

# # {}开启一个子shell,里面的读写会影响外部(当前)的shell变量
# {
#   data=1000
#   echo "{}里面的data=$data"
# }
# echo $data

##变量的扩展

#判断变量是否存在,若num存在则显示num的值,否则显示999(-后面设定的默认值)
# num=-1
# echo ${num:-999}

#判断变量是否存在,若num存在则显示num的值,否则显示999(-后面设定的默认值),并把num赋值为999
# echo ${num:=999}
# echo $num

#字符串的操作
# str="hehe:haha:xixi:lala"
# echo "str的长度:${#str}"

#从下表3截取
# echo ${str:3}

#从下表3截取6个字节,是字节吗???
# echo ${str:3:6}

#${str/old/new}用new替换str中出现的第一个old
# echo ${str/:/#}

#${str//old/new}用new替换str中出现的全部old
# echo ${str//:/#}


##条件测试
# 测试两种写法,一种是 `test 表达式`,另一种是`[ 表达式 ] `,中括号两边要有空格,
# 测文件 参数:-e存在 -d是目录 -f是文件 -r可读 -w可写 -x可执行 -s文件非空
#.profile是否存在
# fileName=".profile"
# [ -e $fileName ]
# echo $?

# 测字符串 参数 =两边相等 -z是空串 !=两边不等 -n非空串
# 测试yn是不是空串
# test -z $yn
# echo $?

# 这里可以研究下""的情况,可以区分(yn="")和(yn=)这两种情况,好像初始赋值为""就等同于没这个变量一样
#意外发现,不用双引号将$yn括起的话,输出是错的
# yn=""
# [ -z "$yn" ]
# echo $? #不是空串,输出1
# [ -n "$yn" ]
# echo $? #不是空串,输出1
# test $yn = "1"
# echo $? #输出0


#数字比较
# 测数字 参数:-eq两边相等 -ne两边不等 -gt左>右 -ge右>=左 -le左<=右 -lt左<右
# a=1
# b=2
# test $a -lt $b
# echo $?

#多条件测试
# test -e ".profile" && test -d "go" && echo "true"

## 控制语句if case for while until break

#if
# read -p "输入1或2:" num
# if [ $num = "1" ]; then
#   echo "1"
# elif [ $num = 2 ]; then
#   echo "2"
# else
#   echo "没有"
# fi

#case
# )左边是变量的值,字符串也不需要加双引号
# read -p "输入choice:" choice
# case $choice in
#   yes | y* | Y*)
#     echo "YES!"
#     ;;
#   no | n* | N*)
#     echo "NO!"
#     ;;# break
#   *)
#     echo "default"
#     ;;
# esac


#for
#declare用于声明一个变量, -i可以表示声明一个int类型的变量
# declare -i sum=0
# declare -i i=0
# for ((i=0; i < 5; i++))
# do
#   sum=$sum+$i
# done
# echo $sum

#或者
# declare -i sum=0
# declare -i i=0
# for i in 1 2 3
# do
#   sum=sum+i
# done
# echo $sum

#while
# declare -i sum=0
# declare -i i=0

# while [ "$i" != "5" ]
# do
#   i=i+1
#   sum+=i
# done
# echo $sum


#until,与while相反,当条件成立时结束循环
# declare -i sum=0
# declare -i i=0
# until [ "$i" = "5" ]
# do
#   sum+=i
#   i+=1
# done
# echo $sum


## 函数
# declare -i a=0
# declare -i b=0
# function getSum() {
#   return $(($1+$2))
# }
# read -p "输入a:" a
# read -p "输入b:" b
# #开始调用
# getSum $a $b
# echo "和为:$?"

###案例,引用

#导入test2
# source test2.sh
# read -p "输入a:" a
# read -p "输入b:" b
# #开始调用
# getSum $a $b
# echo "和为:$?"


## 输出重定向
#命令结果覆盖写入到文件,格式为:命令 > 文件路径
# echo "hello" > a.txt

#命令结果追加写入到文件,格式为:命令 >> 文件路径
# echo "hello" >> a.txt

# /dev/null 文件
# 如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null
# echo "hello" > /dev/null #屏幕上什么也不会输出


## printf格式化输出
# %s 字符串 %d 整型,%c 字符,%f 小数
# -表示左对齐,否则默认右对齐,数字代表字符串占用宽度,不足则填充空格,超出范围仍会全部显示
# printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
# printf "%-10s %-8s %-4.2f\n" 郭靖xxxxxxxxxxxxxx 男 66.1234
# printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
# printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876



本文作者:为何匆匆

本文链接:https://www.cnblogs.com/nyfblog/p/16480798.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   为何匆匆  阅读(60)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起