bash shell基础

https://www.cnblogs.com/jingmoxukong/p/7867397.html详情

1.echo代表输出

echo "Hello World!"

输出带变量的字符串

echo "hello,\"bn\""
an=apple
echo "hello, \"${an}\""

换行

echo "Yes\nNo"
#这里"\n"是不会起换行作用的,因为没有转义
echo -e "Yes\nNo"
#-eb表示开启转义,这时才会换行

开启转义不换行

echo -e "Yes\c"
echo "No"

输出重定向至文件

echo "test" > test.txt

输出执行结果

echo 'pwd'
#输出当前路径目录

2.变量

a="apple"
echo $a
echo ${a}

只读变量,一旦变量被readonly定义,则变量的值不变,如下,去掉#则会执行错误

a="apple"
readonly a
#a="pear"
echo $a

删除变量(unset不能删除只读变量)

a="apple"
echo $a
unset a
echo $a
#输出为空

Variablesbash环境变量列表

  • 单引号的特点
    • 单引号里不识别变量
    • 单引号里不能出现单独的单引号(使用转义符也不行),但可成对出现,作为字符串拼接使用。
  • 双引号的特点
    • 双引号里识别变量
    • 双引号里可以出现转义字符

 单双引号的区别

1.在双引号中,变量引用或者命令置换是会被展开的。在单引号中是不会的。

echo "Your home: $HOME" ### Your home: /Users/<username>
echo 'Your home: $HOME' ### Your home: $HOME

2.当局部变量和环境变量包含空格时,它们在引号中的扩展要格外注意

INPUT="A string  with   strange    whitespace."
echo $INPUT   ### A string with strange whitespace.
echo "$INPUT" ### A string  with   strange    whitespace.

 (如果输入 可能 包含空格,务必要用引号把表达式包起来)

单引号拼接

a="apple"
echo "hello,"${a}""


​

 双引号拼接同理,将单引号改为双引号即可

获取字符串长度(获取数组长度同理,只需将变量改为数组${#nums[*]})

a="apple"
echo ${#a}

提取字符串

a="apple"
echo ${a:2:2}

查找子字符串

a="apple"
echo `expr index "${a}" pp`

创建数组

nums=([0]=0,[1]=1,[2]=2)
fruits=(apple pear "banana grape")

输出数组指定元素

echo ${nums[0]}

输出数组全部元素

echo ${fruits[*]}
echo ${fruits[@]}

每个元素单独一行输出

printf "+ %s\n" ${fruits[*]}

""捆绑时每个元素单独一行输出

​printf "+ %s\n" "${fruits[@]}"

输出数组部分元素

echo ${nums[@]:0:2}

(可以解释为,nums数组从第0个开始输出2个元素)

添加数组元素

fruits=(orange "${fruits[@]}" watermelon)
echo ${fruits[@]}

删除数组某一元素

unset nums[0]
echo ${nums[*]}

运算符

x=10
y=20
val=`expr $[x] + $[y]`
echo "$[x] + $[y] = $val"

val=`expr ${x} - ${y}`
echo "${x} - ${y} = $val"

val=`expr ${x} \* ${y}`
echo "${x} * ${y} = $val"

val=`expr ${y} / ${x}`
echo "${y} / ${x} = $val"

val=`expr ${y} % ${x}`
echo "${y} % ${x} = $val"

if [[ ${x} == ${y} ]]
then
  echo "${x} = ${y}"
fi
if [[ ${x} != ${y} ]]
then
  echo "${x} != ${y}"
fi

关系运算符

if [[ ${x} -eq ${y} ]]; then
   echo "${x} -eq ${y} : x 等于 y"
else
   echo "${x} -eq ${y}: x 不等于 y"
fi

if [[ ${x} -ne ${y} ]]; then
   echo "${x} -ne ${y}: x 不等于 y"
else
   echo "${x} -ne ${y}: x 等于 y"
fi

if [[ ${x} -gt ${y} ]]; then
   echo "${x} -gt ${y}: x 大于 y"
else
   echo "${x} -gt ${y}: x 不大于 y"
fi

if [[ ${x} -lt ${y} ]]; then
   echo "${x} -lt ${y}: x 小于 y"
else
   echo "${x} -lt ${y}: x 不小于 y"
fi

if [[ ${x} -ge ${y} ]]; then
   echo "${x} -ge ${y}: x 大于或等于 y"
else
   echo "${x} -ge ${y}: x 小于 y"
fi

if [[ ${x} -le ${y} ]]; then
   echo "${x} -le ${y}: x 小于或等于 y"
else
   echo "${x} -le ${y}: x 大于 y"
fi

布尔运算符

逻辑运算符

&&表并且,||表或者

字符串运算符

-z

检查字符串长度是否为零,为零返回true,而-n不为零返回true

if [[ -z ${x} ]];then
   echo "-z ${x} : 字符串长度为 0"
else
   echo "-z ${x} : 字符串长度不为 0"
fi

str检查字符串是否为空

if [[ ${x} ]];then
   echo "${x} : 字符串不为空"
else
   echo "${x} : 字符串为空"
fi

文件测试运算符

file="/etc/hosts"

if [[ -r ${file} ]]; then
   echo "${file} 文件可读"
else
   echo "${file} 文件不可读"
fi

 if语句

if [[ 1 -eq 1 ]]; then echo "1 -eq 1 result is: true"; fi
#单行写可以,不过要加;
if [[ 1 -eq 1 ]]; then 
echo "1 -eq 1 result is: true"
fi
#fi表示结束
if [[ 2 -ne 1 ]]; then
  echo "true"
else
  echo "false"
fi
#if-else语句,学过C语言的都知道
x=10
y=20
if [[ ${x} > ${y} ]]; then
   echo "${x} > ${y}"
elif [[ ${x} < ${y} ]]; then
   echo "${x} < ${y}"
else
   echo "${x} = ${y}"
fi
#if elif else语句

 case 语句,适用于面对多种情况要有不同的措施

exec
case ${oper} in
  "+")
    val=`expr ${x} + ${y}`
    echo "${x} + ${y} = ${val}"
  ;;
  "-")
    val=`expr ${x} - ${y}`
    echo "${x} - ${y} = ${val}"
  ;;
  "*")
    val=`expr ${x} \* ${y}`
    echo "${x} * ${y} = ${val}"
  ;;
  "/")
    val=`expr ${x} / ${y}`
    echo "${x} / ${y} = ${val}"
  ;;
  *)
    echo "Unknown oper!"
  ;;
esac

for循环

for arg in elem1 elem2 ... elemN
do
  ### 语句
done

for i in {1..5}; do echo $i; done
#横着写一行

for (( i = 0; i < 10; i++ )); do
  echo $i
done

DIR=/home/zp
for FILE in ${DIR}/*.sh; do
  mv "$FILE" "${DIR}/scripts"
done
# 将 /home/zp 目录下所有 sh 文件拷贝到 /home/zp/scripts

 拓展一下bash里的大括号扩展

Bash扩展(一)大括号扩展和波浪线扩展 - ninja_ken - 博客园

 while循环(跟for循环一样,如果我们把do和被检测的条件写到一行,那么必须要在do之前加一个分号。)

### 0到9之间每个数的平方
x=0
while [[ ${x} -lt 10 ]]; do
  echo $((x * x))
  x=$((x + 1))
done
#  Output:
#  0
#  1
#  4
#  9
#  16
#  25
#  36
#  49
#  64
#  81

 until循环

until循环跟while循环正好相反。它跟while一样也需要检测一个测试条件,但不同的是,只要该条件为  就一直执行循环

select循环

#!/usr/bin/env bash

PS3="Choose the package manager: "
select ITEM in bower npm gem pip
do
echo -n "Enter the package name: " && read PACKAGE
case ${ITEM} in
  bower) bower install ${PACKAGE} ;;
  npm) npm install ${PACKAGE} ;;
  gem) gem install ${PACKAGE} ;;
  pip) pip install ${PACKAGE} ;;
esac
break # 避免无限循环
done
#先询问用户他想使用什么包管理器。接着,又询问了想安装什么包,最后执行安装操作。
#$ ./my_script
#1) bower
#2) npm
#3) gem
#4) pip
#Choose the package manager: 2
#Enter the package name: gitbook-cli

break和continue

 

break语句用来提前结束当前循环。

continue语句用来跳过某次迭代。(通常在fi上行)

# 打印10以内的奇数
for (( i = 0; i < 10; i ++ )); do
  if [[ $((i % 2)) -eq 0 ]]; then
    continue;
  fi
  echo ${i}
done
#  Output:
#  1
#  3
#  5
#  7
#  9

bash函数定义

function my_function() {
  # 函数体
  echo "这是一个函数"
}

my_function() {
  # 函数体
  echo "这是一个函数"
}
#函数可以接受参数

#!/bin/bash
 
function greet() {
  echo "Hello, $1!"
}
 
greet "World"
 
another_greet() {
  echo "Hi there, $1!"
}
 
another_greet "Basher"

#输出
#Hello, World!
#Hi there, Basher!

 

 说明:

  1. 函数定义时,function 关键字可有可无。
  2. 函数返回值 - return 返回函数返回值,返回值类型只能为整数(0-255)。如果不加 return 语句,shell 默认将以最后一条命令的运行结果,作为函数返回值。
  3. 函数返回值在调用该函数后通过 $? 来获得。
  4. 所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至 shell 解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
#!/usr/bin/env bash

calc(){
  PS3="choose the oper: "
  select oper in + - \* / # 生成操作符选择菜单
  do
  echo -n "enter first num: " && read x # 读取输入参数
  echo -n "enter second num: " && read y # 读取输入参数
  exec
  case ${oper} in
    "+")
      return $((${x} + ${y}))
    ;;
    "-")
      return $((${x} - ${y}))
    ;;
    "*")
      return $((${x} * ${y}))
    ;;
    "/")
      return $((${x} / ${y}))
    ;;
    *)
      echo "${oper} is not support!"
      return 0
    ;;
  esac
  break
  done
}
calc
echo "the result is: $?" # $? 获取 calc 函数返回值

 位置参数

$0是脚本本身的名字

shift命令用于将所有的位置参数向左移动,$1的值被丢弃,$2变成$1,$3变成$2,等等

#!/bin/bash
echo "Your first argument is $1"
shift
echo "Your first argument is now $1"

#Your first argument is arg1
#shift
#Your first argument is now arg2

$@和$*都可以获取所有的位置参数,不同的是,$@和$*在被双引号(")包围时处理方式不同

$#可以获取传递给脚本的位置参数的个数

#!/bin/bash
echo "There are $# arguments"

#There are 3 arguments

 $!后台运行的最后一个进程的 ID 号

$-返回使用的当前选项

$?函数返回值

命令置换

``和$()都可以,但二者有区别:$()方式的能力更强,它支持嵌套语法,而反引号``方式不支持命令替换的嵌套

算术扩展

算数表达式必须包在$(( ))

result=$(( ((10 + 5*3) - 7) / 2 ))
echo $result ### 9

在算数表达式中,使用变量无需带上$前缀。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值