기술나눔

시프트 명령 학습

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

시프트 명령 학습

참고 링크: https://www.cnblogs.com/wjq/p/14863580.html

1. 쉘의 몇몇 특수 변수

#!/bin/bash
echo "$0:$0"    # 当前脚本的文件名(间接运行时还包括绝对路径)。
echo "$n:$n"    # 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1 。
echo "$#:$#"    # 传递给脚本或函数的参数个数。
echo "$*:$*"    # 传递给脚本或函数的所有参数。
echo "$@:$@"    # 传递给脚本或函数的所有参数。被双引号 (" ") 包含时,与 $* 不同,下面将会讲到。
echo "$?:$?"    # 上个命令的退出状态,或函数的返回值。
echo "$$:$$"    # 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。
echo "$_:$_"    # 上一个命令的最后一个参数。
echo "$!:$!"    # 后台运行的最后一个进程的 ID 号。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

$* 그리고$@ 이는 큰따옴표("")로 묶이지 않은 경우 함수 또는 스크립트에 전달된 모든 매개변수 앞에 "$1""이 붙는다는 의미입니다. 2 " … " 2" … " 2""n"을 사용하면 모든 매개변수가 출력됩니다. 그러나 큰따옴표("")로 묶인 경우에는 "$*"는 "$1 $2 ...로 모든 매개변수를 전체적으로 취합니다. 모든 매개변수는 n" 형식으로 출력됩니다. 모든 매개변수는 " 'n" 형식으로 출력됩니다. "`N"모든 매개변수를 형식으로 출력합니다."‘@`"는 각 매개변수를 "$1", " 2 " 、 … 、 " 2"、…、" 2""n" 형식으로 모든 매개변수를 출력합니다.

[root@localhost myself]# sh test.sh A B B D E
$0:test.sh
$n:
$#:5
$*:A B B D E
$@:A B B D E
$?:0
$$:109424
$_:$$:109424
$!:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

2. 교대 사용

shift 이 명령은 매개변수를 이동하는 데 사용됩니다(왼쪽 시프트). 일반적으로 전달된 매개변수 수를 알지 못한 채 각 매개변수를 차례로 탐색하고 그에 따라 처리하는 데 사용됩니다. 일반적으로 Linux의 다양한 프로그램 시작 스크립트에서 사용됩니다.

2.1 한 번에 하나의 매개변수 이동

#!/bin/bash
while [ $# != 0 ]
do
    echo -e "参数值为 $1, 参数个数为 $#"
    shift
done

# 每次运行 shift(不带参数的),销毁一个参数(变量的个数($#)减一),后面的参数前移(不管参数之间相隔一个或者多个空格)。
[root@localhost myself]# sh shift1.sh a b c d e
参数值为 a, 参数个数为 5
参数值为 b, 参数个数为 4
参数值为 c, 参数个数为 3
参数值为 d, 参数个数为 2
参数值为 e, 参数个数为 1

# 注意:上述脚本,如果 shift 移动参数变为 2 ,在参数个数为奇数时则会出现死循环,如果是偶数则没问题。
# 脚本示例:
#!/bin/bash
while [ $# != 0 ]
do
    echo -e "参数值为 $1, 参数个数为 $#"
    shift 2		# 这里移动位数变为2
done
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

2.2 매번 여러 매개변수 이동

Shift 명령이 한 번에 이동하는 매개변수의 수는 전달하는 매개변수에 의해 지정됩니다.예를 들어 이제 $1, $2, $3, ..., $9 매개변수가 있습니다. 쉘 프로그램이 처음 4개의 명령줄 매개변수를 처리한 후(즉, 다음 5개의 매개변수가 남음) 다음을 사용할 수 있습니다.shift 4 이 명령은 $9를 $1로 이동합니다.

  • 예: 각 교대에 대한 교대 매개변수 수를 사용자 정의합니다.
#!/bin/bash
while [ $# -gt 5 ]
do
    echo -e "参数值为 $1, 参数个数为 $#"
    shift
done
shift 4
echo -e "参数值为 $1, 参数个数为 $#"


[root@localhost myself]# sh shift2.sh a1 b2 c3 d4 e5 f6 g7 h8 i9
参数值为 a1, 参数个数为 9
参数值为 b2, 参数个数为 8
参数值为 c3, 参数个数为 7
参数值为 d4, 参数个数为 6
参数值为 i9, 参数个数为 1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

2.3 케이스와 함께 사용

사례 소개

case ..... esac 그리고if ... then ... fi 그들은 모두 조건부 문장 구조입니다. 예를 들어 역순 알파벳 단어와 정방향 단어를 사용하여 쌍을 이룹니다.if 명령문, 끝에 사용됨fi 일치하다,esac 그리고case

case $参数变量 in	# 以关键字 case 作为开始
"变量值1")			# 变量值用双引号括起来,关键字用小括号括起来
    程序段1		# 对应的逻辑
    ;;              # 每个类别结尾使用两个连续的分号来处理
"变量值2")
    程序段2
    ;;
"变量值3")
    程序段3
    ;;
*)                 # 最后一个位置参数值会用*来代替所有其他值
    程序段4
    ;;
esac               # 关键字 esac(case 的反写) 结束
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 예: shift 성냥case ... esac 쉘 스크립트 수동 전달 매개변수 처리 구현
#!/bin/bash
while [ -n "$1" ]
do
  case "$1" in
    -a)
        echo "发现 -a 选项"
        ;;
    -b)
        echo "发现 -b 选项"
        echo "-b 选项的参数值是:$2"
        shift
        ;;
    -c)
        echo "发现 -c 选项"
        echo "-c 选项的参数值是:$2"
        shift
        ;;
    *)
        echo "$1 是一个未知选项"
        ;;
  esac
  shift
done

[root@localhost myself]# sh shift3.sh -a -b 200 -c 300 -d 400
发现 -a 选项
发现 -b 选项
-b 选项的参数值是:200
发现 -c 选项
-c 选项的参数值是:300
-d 是一个未知选项
400 是一个未知选项
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32