【转】shell中的$0 $n $# $* $@ $? $$ 变量 if case for while
shell中的$0 $n $# $* $@ $? $$
$0
当前脚本的文件名
$n
传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$#
传递给脚本或函数的参数个数。返回数字类型
$*
传递给脚本或函数的所有参数。返回参数列表
$@
传递给脚本或函数的所有参数。
$* 和 $@ 都表示传递给函数或脚本的所有参数,$* 和 $@ 的区别
- 相同点:不被双引号" “包含时,都以”$1" “$2"…"$n” 的形式输出所有参数
- 不同点:被双引号" “包含时,”$*" 会将所有的参数作为一个整体;"$@" 会将各个参数分开,以换行形式输出所有参数。
$?
上个命令的退出状态,或函数的返回值。
$$
当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID
Linux中的$符号的三种常见用法
echo "VERSION=${CI_APPLICATION_TAG:-$(date +%Y%m%d%H%M%S)}">.version;
if [ "$ciPosition" == "1" ]; then ciName="shop" elif [ "$ciPosition" == "2" ]; then ciName="sso" elif [ "$ciPosition" == "3" ]; then ciName="shuaige" fi
case ${option} in api) command_api $@ ;; front) command_front $@ ;; sso) command_sso $@ ;; crm) command_crm $@ ;; admin) command_admin $@ ;; -h|--help) usage exit 0 ;; *) echo "Unexpected option: ${option} - this should not happen." usage exit 2 ;; esac
带双引号的"$*" 和 "$@“ 区别
#fearch 循环
for j in '\\' '|' '/' '-' do printf "%c 已完成 [%-${LENGTH}s] %d/%d. \r" "$j" "$MASK" "$SUCCEEDED" "$LENGTH"; sleep 0.5 done ----------------------------
#for 循环
list=() STEP=3 for((i=0; i < ${#list[@]}; i+=STEP)) do .... done
while : do case "$1" in -h | --help) usage exit 0 ;; -v | --version) VERSION="$2" shift 2 ;; --debug) ENABLE_DEBUG=1 shift ;; --) shift; break ;; *) echo "Unexpected option: $1 - this should not happen." usage exit 2 ;; esac done
read commitMessage read -p " 请按任意键退出!" -n 1
# 日志相关 function log_debug () { if [ $ENABLE_DEBUG -eq 1 ]; then DATE_N=`date "+%Y-%m-%d %H:%M:%S"` USER_N=`whoami` echo "${DATE_N} ${USER_N} execute $0 [DEBUG] $@" fi } function log_info () { DATE_N=`date "+%Y-%m-%d %H:%M:%S"` USER_N=`whoami` echo "${DATE_N} ${USER_N} execute $0 [INFO] $@" } function log_error () { DATE_N=`date "+%Y-%m-%d %H:%M:%S"` USER_N=`whoami` echo -e "\033[41;37m${DATE_N} ${USER_N} execute $0 [ERROR] $@ \033[0m" }
log_info "清理所有资源."