我是 bash 的新手,在閱讀并嘗試了很多關于如何決議引數的內容后,我無法做我真正想做的事情,我想決議可選引數而不是可選引數。更具體地說,我想決議 3 個引數,第一個(fastaq 檔案)第二個(第二個可選的 fastaq 檔案)第三個引數,它將是一個目錄。
my_script.sh -f1 file1.fasta --f2 file2.fasta -d/home/folder1/folder2
或者
my_script.sh -f1 file1.fasta -d /home/folder1/folder2
我嘗試以多種方式執行此操作,但我不知道如何讓程式識別何時有兩個 fasta 檔案和一個目錄,以及何時只有一個 fasta 檔案和一個目錄。
有了這個引數,我想將它們保存在變數中,因為它們稍后將被第三方使用。
我試過這個:
for i in "$@"; do
case $i in
-f1=|-fasta1=)
FASTA1="${i#=}"
shift # past argument=value
;;
-d) DIRECTORY=$2
shift 2
;;
-d=|-directory=) DIRECTORY="${i#=}"
shift # past argument=value
;;
--f2=|-fasta2=) FASTA2="${i#*=}"
shift # past argument=value
;;
*)
;;
esac
done
但我剛得到這個
scripts_my_first_NGS]$ ./run.sh -f1 fasta.fasta -d /home/folder1
FASTA1 =
DIRECTORY =
FASTA2 =
uj5u.com熱心網友回復:
基本上,您需要為不與等號一起使用的選項版本添加單獨的決議器。
shift由于您正在處理for回圈,因此您的命令也是無用的。因此,請將其轉換為while [[ $# -gt 0 ]]; do回圈。
我還添加了一些我建議添加的修改。
while [[ $# -gt 0 ]]; do
case $1 in
-f1|-fasta1)
FASTA1=$2
shift
;;
-f1=*|-fasta1=*)
FASTA1=${1#*=}
;;
-d|-directory)
DIRECTORY=$2
shift
;;
-d=*|-directory=*)
DIRECTORY=${1#*=}
;;
-f2|fasta2)
FASTA2=$2
shift
;;
-f2=*|-fasta2=*)
FASTA2=${1#*=}
;;
-*)
echo "Invalid option: $1" >&2
exit 1
;;
--)
# Do FILES =("${@:2}") maybe
break
;;
*)
# TODO
# Do FILES =("$1") maybe
;;
esac
shift
done
選項的相等和不相等版本的“決議器”也可以通過使用輔助函式來統一:
function get_opt_arg {
if [[ $1 == *=* ]]; then
__=${1#*=}
return 1
elif [[ ${2 .} ]]; then
__=$2
return 0 # Tells that shift is needed
else
echo "No argument provided to option '$1'." >&2
exit 1
fi
}
while [[ $# -gt 0 ]]; do
case $1 in
-d|-directory|-d=*|-directory=*)
get_opt_arg "$@" && shift
DIRECTORY=$__
;;
-f1|-fasta1|-f1=*|-fasta1=*)
get_opt_arg "$@" && shift
FASTA1=$__
;;
-f2|fasta2|-f2=*|-fasta2=*)
get_opt_arg "$@" && shift
FASTA2=$__
;;
-*)
echo "Invalid option: $1" >&2
exit 1
;;
--)
# Do FILES =("${@:2}") maybe
break
;;
*)
# TODO
# Do FILES =("$1") maybe
;;
esac
shift
done
uj5u.com熱心網友回復:
永遠不要自己決議命令列選項!
相反getopts,如果您不需要 GNU 樣式的長選項,請使用 Bash 函式,否則請使用 GNU 程式getopt。
以下示例使用一個陣列FASTA。FASTA1是${FASTA[0]}和FASTA2是${FASTA[1]}。在getopts這種情況下,可以-f多次使用一個選項字符 ( )。
getopts僅使用一個字符選項:
#! /bin/bash
FASTA=()
DIRECTORY=
while getopts 'f:d:' option; do
case "$option" in
f)
FASTA =("$OPTARG")
;;
d)
DIRECTORY="$OPTARG"
;;
*)
printf 'ERROR: Invalid argument\n' >&2
exit 1
;;
esac
done
shift $((OPTIND-1))
if [[ -z ${FASTA[0]} ]]; then
printf 'ERROR: FASTA1 missing\n' >&2
exit 1
fi
if [[ -z $DIRECTORY ]]; then
printf 'ERROR: DIRECTORY missing\n' >&2
exit 1
fi
printf 'FASTA1 = %s\n' "${FASTA[0]}"
printf 'FASTA2 = %s\n' "${FASTA[1]}"
printf 'DIRECTORY = %s\n' "$DIRECTORY"
用法:
run -f file1.fasta -f file2.fasta -d /home/folder1/folder2
混合使用getopt單字符和 GNU 樣式長選項:
#! /bin/bash
FASTA=()
DIRECTORY=
options=$(getopt -o d: -l f1: -l f2: -- "$@") || {
printf 'ERROR: Invalid argument\n' >&2
exit 1
}
eval set -- "$options"
while true; do
case "$1" in
--f1)
FASTA[0]="$2"
shift 2;;
--f2)
FASTA[1]="$2"
shift 2;;
-d)
DIRECTORY="$2"
shift 2;;
--)
shift
break;;
*)
break;;
esac
done
if [[ -z ${FASTA[0]} ]]; then
printf 'ERROR: FASTA1 missing\n' >&2
exit 1
fi
if [[ -z $DIRECTORY ]]; then
printf 'ERROR: DIRECTORY missing\n' >&2
exit 1
fi
printf 'FASTA1 = %s\n' "${FASTA[0]}"
printf 'FASTA2 = %s\n' "${FASTA[1]}"
printf 'DIRECTORY = %s\n' "$DIRECTORY"
用法:
run --f1 file1.fasta --f2 file2.fasta -d /home/folder1/folder2
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/407370.html
標籤:
