Linux-shell

shell

#为注释

#!执行脚本的 解释器 为bash

执行方法一 : 1:bash 1.sh 2: 1.sh

权限问题 remark

调试 bash -x

man test


变量 —>默认必须全局变量 局部变量必须给local


变量

a=0; 弱类型语言 没有明确类型

命令替换符号· pwd

➜  shell_test a=`pwd`
➜  shell_test echo $a
/root/shell_test
➜  shell_test a=$a:a:
➜  shell_test echo $a
/root/shell_test::

这只是一个字符串拼接

局部变量

local b=5 局部变量—必须给local

特殊变量

位置变量

$0:获取当前执⾏shell脚本的⽂件名,包括路径。

$n: 获取当前执⾏脚本的第n个参数,n=1…9,如果n⼤于9,则需要将n使用⼤括号括起

来;

$*:获取当前shell的所有参数,将所有命令⾏参数视为单个字符串,相当于"$1$2$3";

$#:得到执⾏当前脚本的参数个数;个数 ./1.sh 1 2 3 7

$@:获取这个程序所有参数,并保留参数之间的任何空白,相当于"$1" "$2" "$3",这

是将参数传给其他程序的最好办法;

状态变量

$? 判断是否成功执行 -非0 都是错误的

$$:取当前进程的PID

$!:上一个指令的PI

 符号

- 大于 -gt (greater than)

- 小于 -lt (less than)

- 大于或等于 -ge (greater than or equal)

- 小于或等于 -le (less than or equal)

- 不相等 -ne (not equal)

- 相等 -eq (equal) 

 


输入输出 - READ

read [-options] [variable…]

example

->read age     
->input  1444 
->echo $age
➜  shell_test read name age
name  111
➜  shell_test echo $name $age
name 111

-a array #把输⼊赋值到数组 array 中,从索引号零开始。

-d delimiter

#用字符串 delimiter 中的第⼀个字符指示输⼊结束,⽽不是⼀个换⾏符

-e

#使用 Readline 来处理输⼊。这使得与命令⾏相同的⽅式编辑输⼊

-n num

#读取 num 个输⼊字符,⽽不是整⾏

-p prompt

#为输⼊显示提示信息,使用字符串 prompt

example :

➜  shell_test read -p "Please input your and age" name

-r

#Raw mode. 不把反斜杠字符解释为转义字符

-s

#Silent mode.

➜  shell_test read -p -s "Please input your and age" name  --遮掩  类似登录遮掩米面

-t seconds #超时

-u fd

#使用⽂件描述符 fd 中的输⼊,⽽不是标准输⼊

Reamrk

centos 6 的环境下 必须强调 参数 使用读入参数必须要有 $符号 (ubuntu 似乎不需要)

  1 #!/bin/bash
  2 read n
  3 if [ $n -gt 0 ];then
  4     echo ">0"
  5 else
  6     echo "<0"
  7 fi                         

 


流程语句

数字类型比较

IF-ELSE

强调一下 if[[]] 必须加; 在 then 后面必须杰 fi

example

#!/bin/bash
  2 read n
  3 if [[ $n -gt 0 ]];then
  4     echo ">0"
  5 else
  6     echo "<0"
  7 fi    

判断是否为空

  1 #!/bin/bash
  2 read n
  3 if [[ ${n}x == x ]]; then                                                                           4    echo "n is null"
  5 else
  6     echo "n = $n"
  7 fi

标准长度判断

 #!/bin/bash                                                                                                                                                                                                    2 read n
  3 if [[  ! -n ${n} ]]; then
  4    echo "n is null"
  5 else
  6     echo "n = $n"
  7 fi

elif

 #!/bin/bash 
  2 read n
  3 if [[ $n -gt 0 ]];then
  4     echo "$n >12"
  5     elif [[ $n -eq 12 ]] ;then                                                                      6     echo "$ n<12"
  7 else
  8     echo "xxx"
  9 fi

case

用于主要用于菜单

function __test__(){
    echo "1xxxx"
    echo "2xxxx"
    echo "3xxxx"
}

__test__

read a
case $a in
    1 )
         echo "xxx"
    ;;
    2)
         echo "yyy"
    ;;
    3 )
         echo "xxxxx"
    ;;
esac

循环

FOR

Example

  1 #! /bin/bash
  2 for each in `ls`;do
  3     echo ${each}
  4 done 

类似于foreach 语句

标准循环

9 for (( i = 1 ; i < 10 ; i++ )); do
10    ls ${i}.*                                                                                                                                                                                                 11 done

做个小题目 偶数

echo "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
 25 for i  in `seq 0 100`; do
 26     if [[ $[i % 2] -eq 1 ]] ; then
 27     echo $i
 28     fi
 29 done                                     

while

  2 number =0
  3 while [[ ${number} -lt 100 ]]; do
  4   echo  ${number}
  5   number =$[${number}+1]                                                                                                                                                                                       6   let number+=1
  7 done

continue

会跳过当前循环中的代码,强迫开始下一次循环。

 for (( i = 1 ; i < 10 ; i++ )); do
 20     ls ${i}.*
 21    if [[ $i -eq 3 ]]; then
 22        continue
 23    fi
 24
 25    if [[$i -eq 6 ]]; then
 26        continue
 27    fi
 28 done                                                                                                                                                                        23 done

数组Arrary

declare 声明方式

declare a test

数组操作

输出数组内容   //需要大括号转义
 ${【【】[*]}
 ${arry[@]}
确定数组元素个数  总数
 ${#arry[@]}
找到数组的下标
 ${!arry[@]}
数组长度
echo ${#test}

数据追加

arry+(abc);
sort  排序

数组实例 筛选素数

#! /bin/bash                                                                                                       
    while [[ 1 ]];do
    echo "inpuut the number: ";
    read n
       for (( i=2; i< ${n}; i++));do
            flag=1
          if [[ $[${n}%${i} ] -eq 0 ]];then
              echo " is not prime"
               flag=0
              break
         fi
      done
      if [[ ! ${flag} -eq 0 ]];then
         echo "is prime"
      fi
 
  done

变量,参数展开

${parameter:-word}  如果变量未定义,则表达式的值为word。   --如果指令的某个参数出现了异常,通过该指令补充指令
${parameter:=word}  如果变量未定义,则设置变量的值为word,返回表达式的值 也是word。 与之同上
${parameter:?word}  用于捕捉由于变量未定义而导致的错误并退出程序,
rm ${c:?"not found"}/*
zsh: c: "not found"
echo $?
1  返回1

rm ${c:+"not found"}/* 如果变量已经定义,返回word,也就是真。  判断是否存在

提示一下 [!]是查history 记录的id
${!prefix*}   如 abc=13 abd =12   echo ${!ab*}  匹配全部ab开头的变量

example : find ${pate :-/error} -name ".c" -type f | xargs rm -f  报错
example : find ${pate :? error} -name ".c" -type f | xargs rm -f  报错 
!号 模糊匹配   !cl     a=abc  echo ${! ab*} 
变量如果为空 :/ 补      出错退出 :?error
保证指令出错的健壮性 




${#parameter} 输出字符串的长度  echo ${#a}       a=123
${parameter:offset} 从第offset字符开始截取    a=123  echo ${a:1}
${parameter:offset:length} 从offset字符开始截取,取length长度  ➜    a=123  ~ echo ${a:1:1}  2 
${parameter#pattern} 从头删除最短匹配  模糊匹配
${parameter##pattern} 从头删除最长匹配 模糊匹配




ü${parameter//pattern/string} 全部匹配被替换
ü${parameter/#pattern/string} 字符串开头的替换
ü${parameter/%pattern/string} 字符串结尾的替换
ü${parameter,,} ${parameter^^} 全部转换为小写、大写
ü${parameter,} ${parameter^} 首字母转换为小写、大写

权限问题 remark

➜  shell_test sudo ./1.sh
sudo: ./1.sh: command not found

升级权限

➜  shell_test chmod +x 1.sh
./1.sh 执行成功
posted @ 2022-06-29 14:13  Aquiet  阅读(35)  评论(0编辑  收藏  举报