Shell

shell之shift

2024-09-19  本文已影响0人  Joening

在 shell 编程中,shift 命令用于操作脚本参数。具体来说,shift 命令会左移位置参数,将 2 变为1,3 变为2,以此类推。原来的 $1 会被丢弃。这个命令在处理不定数量的参数时非常有用。

基本用法
shift [n]
n 是一个可选参数,表示左移的次数。如果未指定,默认值为 1。
示例
假设你有一个脚本 example.sh,内容如下:

#!/bin/bash

echo "Initial parameters: $@"

shift

echo "After one shift: $@"

shift 2

echo "After two more shifts: $@"

假设你运行这个脚本并传递一些参数:

./example.sh arg1 arg2 arg3 arg4 arg5
输出将会是:

Initial parameters: arg1 arg2 arg3 arg4 arg5
After one shift: arg2 arg3 arg4 arg5
After two more shifts: arg4 arg5
处理不定数量的参数
shift 命令在处理不定数量的参数时非常有用。下面是一个示例脚本,演示如何使用 shift 来处理所有传递的参数:

#!/bin/bash

while [ "$#" -gt 0 ]; do
  echo "Processing parameter: $1"
  shift
done
运行这个脚本:

./example.sh param1 param2 param3
输出将会是:

Processing parameter: param1
Processing parameter: param2
Processing parameter: param3

使用 shift 处理选项和参数
你可以结合 shift 和 case 语句来处理脚本的选项和参数。下面是一个示例脚本,演示如何处理选项和参数:

#!/bin/bash

while [ "$#" -gt 0 ]; do
  case "$1" in
    -a|--option-a)
      echo "Option A selected"
      shift
      ;;
    -b|--option-b)
      echo "Option B selected, argument: $2"
      shift 2
      ;;
    *)
      echo "Unknown option: $1"
      shift
      ;;
  esac
done

运行这个脚本:

./example.sh -a -b value arg1 arg2
输出将会是:

Option A selected
Option B selected, argument: value
Unknown option: arg1
Unknown option: arg2
function main (){
  while [[ $# -gt 0 ]]; do
    key="$1"

    case $key in
      -v|--version)
        VERSION="$2"
        shift
        ;;
      -o|--output)
        CVESSEL_SNAPSHOT_DIR="$2"
        shift
        ;;
      *)
        echo "无效的选项: $key"
        usage
        exit 1
        ;;
    esac
    shift
  done

  # 检查 -v 参数是否存在
  if [ -z "$VERSION" ]; then
    echo "错误:缺少 -v 参数"
    usage
    exit 1
  fi
}

function clean_file() {
  local file=$1
  if [ -f "$file" ]; then
    sed -i '/^#/d;/^$/d' "$file"
    echo "Cleaned $file"
  else
    echo "Error: $file does not exist"
  fi
}

总结
shift 命令用于左移位置参数。
默认情况下,shift 左移一次,可以指定一个参数来左移多次。
shift 在处理不定数量的参数和选项时非常有用。
通过使用 shift,你可以更加灵活地处理脚本参数,编写更加通用和可复用的脚本。

#!/usr/bin/env bash
# Author: qiaoning

function get_image_list() {
    local image_list=$(docker images | awk 'NR>1 {print $1":"$2}')
    for item in ${image_list}; do
        echo "${item}"
    done
}

function usage() {
    echo "Usage: $0 [-d]"
    echo "Options:"
    echo "  -d    Drop flag to print image list"
    exit 1
}

# Parse command-line options
while getopts "d" opt; do
    case ${opt} in
        d)
            drop=true
            ;;
        *)
            usage
            ;;
    esac
done

function main() {
    # Check if the drop flag is set
    if [ -z "${drop}" ]; then
        echo "Flag '-d' not set. Exiting..."
        exit 1
    fi

    if [ "${drop}" == "true" ]; then
        echo "Printing image list..."
        sleep 20
        get_image_list
    fi
}

main
#!/bin/bash

# 函数:检查并创建文件或目录
check_and_create() {
    local path=$1
    local type=$2  # type 可以是 "file" 或 "dir"

    if [ "$type"!= "file" ] && [ "$type"!= "dir" ]; then
        echo "错误:类型必须是 'file' 或 'dir'。"
        return 1
    fi

    if [ "$type" == "file" ]; then
        if [! -f "$path" ]; then
            touch "$path"
            echo "文件 $path 已创建。"
        else
            echo "文件 $path 已存在。"
        fi
    elif [ "$type" == "dir" ]; then
        if [! -d "$path" ]; then
            mkdir -p "$path"
            echo "目录 $path 已创建。"
        else
            echo "目录 $path 已存在。"
        fi
    fi
}

# 示例使用
check_and_create "/path/to/your/file.txt" "file"
check_and_create "/path/to/your/directory" "dir"
#!/bin/bash

while [ $# -gt 0 ]; do
    case "$1" in
        -f|--file)
            FILE="$2"
            shift 2
            ;;
        -d|--directory)
            DIRECTORY="$2"
            shift 2
            ;;
        *)
            echo "未知选项: $1"
            exit 1
            ;;
    esac
done

echo "文件: $FILE"
echo "目录: $DIRECTORY"
#!/bin/bash

# 定义文件路径
FILE_PATH="/path/to/your/file.txt"

# 使用 while 读取文件内容
while IFS= read -r line; do
    # 去除行首尾的空白字符
    line=$(echo "$line" | xargs)
    
    # 检查行是否为空或以 # 开头
    if [ -z "$line" ] || [[ $line =~ ^# ]]; then
        # 如果是空行或以 # 开头,则跳过
        continue
    fi
    
    # 处理有效行
    echo "处理行: $line"
    # 在这里添加你需要对每行执行的操作
done < "$FILE_PATH"

占位符

cp file1 file2
if [ $? -eq 0 ]; then
    :
else
    echo "拷贝失败"
fi
#!/bin/bash

file="images.txt"
MAX_JOBS=5

if [ ! -f "$file" ]; then
  echo "镜像列表文件 $file 不存在"
  exit 1
fi

while IFS= read -r image; do
    image="$(echo "$image" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
    if [[ -z "$image" || "$image" == \#* ]]; then
        continue
    fi
    (
        echo "拉取镜像: $image"
        docker pull "$image"
        if [ $? -eq 0 ]; then
            echo "成功拉取: $image"
        else
            echo "拉取失败: $image"
        fi
    ) &
    while [ $(jobs -r | wc -l) -ge $MAX_JOBS ]; do
        sleep 0.5
    done
done < "$file"

wait
echo "所有镜像已并发拉取完成"
上一篇 下一篇

猜你喜欢

热点阅读