我有一个shell脚本,用于启动一些ROS启动器文件(对我的问题不重要)。我的要求是使用一些参数,因此我使用getopts
。
基本上,我得到一个或几个文件,用ROS播放它们并同时将所有文件记录回单个文件。之后,如果我提供了参数-r
或-c
,我想在录制的文件上运行两个额外的操作(reindex和compress)。但在运行-r
和-c
之前,需要完成其他过程。我使用的是wait
关键字,但我不确定我是否真的了解这个流程。换句话说,应该完成播放和录制,只有在作为参数提供时才应运行-r和-c。
第二个问题与如何获取或传递输出到这两个函数(reindex
和compress
)的同一文件有关?
所以我想要的格式是:
./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
}
提前谢谢!
答案 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
我没有保留这些功能,因为他们没有在重写的代码中提供任何价值。