shell脚本中的执行顺序,并将正确的参数传递给函数

时间:2015-06-10 23:44:13

标签: bash shell

我有一个shell脚本,用于启动一些ROS启动器文件(对我的问题不重要)。我的要求是使用一些参数,因此我使用getopts

基本上,我得到一个或几个文件,用ROS播放它们并同时将所有文件记录回单个文件。之后,如果我提供了参数-r-c,我想在录制的文件上运行两个额外的操作(reindex和compress)。但在运行-r-c之前,需要完成其他过程。我使用的是wait关键字,但我不确定我是否真的了解这个流程。换句话说,应该完成播放和录制,只有在作为参数提供时才应运行-r和-c。

第二个问题与如何获取或传递输出到这两个函数(reindexcompress)的同一文件有关?

所以我想要的格式是:

./myscript -i file1 -i file2 -o /home/output -r -c

#!/bin/bash  

OUTPUT_FILE_NAME="output_$(date +%Y.%m.%d--%H_%M_%S)"

usage="
$(basename "$0") [-i] [-o] [-r] [-c] [-h] -- to be done"

# Reset is necessary if getopts was used previously in the script.
OPTIND=1    

while getopts ":i:orch:" opt; do
    case $opt in
        i ) echo "INPUT file - argument = $OPTARG"; input_files+=($OPTARG) ;;
        o ) echo "OUTPUT dir - argument = $OPTARG"; output_dir=($OPTARG) ;;
        r ) echo "REINDEX"; reindex ;;
        c ) echo "COMPRESS"; compress ;;
        h ) echo "$usage"
            graceful_exit ;;
        * ) echo "$usage"
            exit 1
    esac
done

# Shift off the options
shift $((OPTIND-1))

roslaunch myLauncher.launch &

echo "Number of loaded files: ${#input_files[@]}"
echo -n "FILES are:"
rosbag play ${input_files[@]} &
rosbag record -o $output_dir/$OUTPUT_FILE_NAME -a &
wait

function reindex{
    rosbag reindex $output_dir/$OUTPUT_FILE_NAME
}

function compress{
    rosbag reindex $output_dir/$OUTPUT_FILE_NAME
}

提前谢谢!

1 个答案:

答案 0 :(得分:1)

您非常接近您需要的地方 - 使用getopts也会让您坚定地走上正确的轨道。注意是否需要在选项解析循环中重新索引或压缩。然后,在播放音乐并写入输出文件后,如果需要,运行函数中的代码:

#!/bin/bash  

OUTPUT_FILE_NAME="output_$(date +%Y.%m.%d--%H_%M_%S)"

usage="$(basename "$0") [-i file] [-o file] [-r] [-c] [-h]"

input_files=()  # Empty list of files/tracks
output_dir="."  # Default output directory
r_flag="no"     # No reindex by default
c_flag="no"     # No compress by default

while getopts ":i:orch:" opt; do
    case $opt in
        (i) echo "INPUT file - argument = $OPTARG"; input_files+=("$OPTARG");;
        (o) echo "OUTPUT dir - argument = $OPTARG"; output_dir="$OPTARG";;
        (r) echo "REINDEX"; r_flag="yes";;
        (c) echo "COMPRESS"; c_flag="yes";;
        (h) echo "$usage" >&2; exit 0;;
        (*) echo "$usage" >&2; exit 1;;
    esac
done

# Shift off the options
shift $((OPTIND-1))

if [ $# != 0 ] || [ "${#input_files[@]}" = 0 ] ||
then
    echo "$usage" >&2
    exit 1
fi

roslaunch myLauncher.launch &

echo "Number of loaded files: ${#input_files[@]}"
echo -n "FILES are:"
rosbag play "${input_files[@]}" &
rosbag record -o "$output_dir/$OUTPUT_FILE_NAME" -a &
wait

if [ "$r_flag" = "yes" ]
then
    rosbag reindex "$output_dir/$OUTPUT_FILE_NAME"
fi
if [ "$c_flag" = "yes" ]
then
    rosbag compress "$output_dir/$OUTPUT_FILE_NAME"
fi

我没有保留这些功能,因为他们没有在重写的代码中提供任何价值。