脚本内容如下:
#!/bin/bash -e
scp_dir=/media/lyn/win_data/lyn_workdata/working/robot-ctl
download_data=/home/lyn/Documents/work-data/download_data
build_dir=/home/lyn/projects/yocto/yocto-build/tmp/work/aarch64-poky-linux/robotctl/git-r0/git/
image_dir=/home/lyn/projects/yocto/yocto-build/tmp/work/aarch64-poky-linux/robotctl/git-r0/image/robot-ctl/
remote_exec_file_dir=/home/lyn/Documents/work-data/download_data/scp_exec.sh
all_build=No
wifi_src=No
only_scp_robot=No
strip_mode=No
ip_wireless_dhcp=170.160.111.45
ip_ethernet_dhcp=170.160.111.147
local_ip=${ip_wireless_dhcp}
host_name=lyn
date
echo -e "\033[0;31m Loading options.\033[0m"
# Load all the options.
if [ $# -eq 0 ];then
echo -e "\033[33;5m no argument \033[0m"
fi
for arg in "${@}"
do
if [[ -n "${arg}" ]] && [[ "${arg}" == "wifi" ]] ; then
wifi_src="Yes"
local_ip=${ip_ethernet_dhcp}
echo -e "local connect robot wifi \n --${wifi_src}\n --ip:${local_ip}."
fi
if [[ -n "${arg}" ]] && [[ "${arg}" == "scp" ]] ; then
only_scp_robot="Yes"
local_ip=${ip_ethernet_dhcp}
echo -e "scp robot local connect robot wifi \n --scp:${only_scp_robot} -
-${wifi_src}\n --ip:${local_ip}."
fi
if [[ -n "${arg}" ]] && [[ "${arg}" == "all_build" ]] ; then
all_build="Yes"
echo -e "all bulid"
fi
if [[ -n "${arg}" ]] && [[ "${arg}" == "ip" ]] ; then
echo -e "\033[32m ip:=\033[0m"
read ip_addr
local_ip=${ip_addr}
wifi_src="Yes"
echo -e "scp robot local ip insert \n --scp:${only_scp_robot} -
-${wifi_src}\n --ip:${local_ip}."
fi
if [[ -n "${arg}" ]] && [[ "${arg:0:3}" == "ip=" ]] ; then
echo -e "\033[32m ip put:=\033[0m" ${arg#*=}
local_ip=${arg#*=}
wifi_src="Yes"
echo -e "scp robot local ip insert \n --scp:${only_scp_robot} -
-${wifi_src}\n --ip:${local_ip}."
fi
if [[ -n "${arg}" ]] && [[ "${arg}" == "debug" ]] ; then
echo -e "\033[32m need \033[0m" ${arg}
strip_mode="Yes"
echo -e "scp robot local ip insert \n --scp:${only_scp_robot} -
-${wifi_src}\n --ip:${local_ip}."
fi
done
if [ "${only_scp_robot}" == "No" ];then
if [ ! "${wifi_src}" == "Yes" ] ; then
echo -e "local don't connect robot wifi \n --${wifi_src}\n --ip:${local_ip}."
fi
if [ -d "${build_dir}" ]; then
cd ${build_dir}
scp -rp lyn@{local_ip}:${scp_dir}/src \
lyn@{local_ip}:${scp_dir}/include \
lyn@{local_ip}:${scp_dir}/CMakeLists.txt .
//ssh ${host_name}@${local_ip} "${remote_scp_code_dir}"
#git pull
if [ "${all_build}" == "Yes" ] ; then
./../temp/run.do_generate_toolchain_file
./../temp/run.do_configure
fi
./../temp/run.do_compile
./../temp/run.do_install
#cd /home/lyn/
if [ "${strip_mode}" == "No" ]; then
#./strip_x1000.sh
cd ${image_dir}
aarch64-linux-gnu-strip pp
fi
else
echo -e "\033[0;31m dir is not exist.\033[0m"
fi
fi
scp ${image_dir}/exec ${host_name}@${local_ip}:${download_data}
if [[ "${wifi_src}" == "Yes" ]] || [[ "${only_scp_robot}" ]] ; then
ssh ${host_name}@${local_ip} "${remote_exec_file_dir}"
else
echo -e "no robot wifi\n"
fi
服务器执行的脚本内容比较长,从执行的流程来说,在这个脚本中,大致为初始化读取脚本执行传入的 参数,通过参数配置不同的变量匹配不同机器状态,紧接着,拷贝本地的文件到服务器编译,服务器编 译完成之后拷贝可执行文件到本地,再调用本地的脚本把可执行文件拷贝到机器对应的目录。
这个脚本有些使用技术和第一个脚本有重合,此处仅说没有讲到的部分。
首先第一个使用的就是 { $# } 和 {$@ }
下面是从菜鸟教程拷贝的shell传参的特殊字符介绍
参数 处理 | 说明 |
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数。 如"用「」括起来的情况、以1 n"的形式输 出所有参数。 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与相同,但是使用时加引号,并在引号中返回每个参数。如@"用「"」括起来的情况、 以"2" … "$n" 的形式输出所有参数。 |
$- | 显示Shell使用的当前选项 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
我在其中使用了$#用来辅助提醒输入的参数数量,防止出错;
if [ $# -eq 0 ];then
echo -e "\033[33;5m no argument \033[0m"
fi
然后使用$@把传入的参数一个个解析出了来,进行变量的配置。
for arg in "${@}"
do
if [[ -n "${arg}" ]] && [[ "${arg}" == "wifi" ]] ; then
wifi_src="Yes"
local_ip=${ip_ethernet_dhcp}
echo -e "local connect robot wifi \n --${wifi_src}\n --ip:${local_ip}."
fi
...
done
其次使用了字符串截取的操作
if [[ -n "${arg}" ]] && [[ "${arg:0:3}" == "ip=" ]] ; then
echo -e "\033[32m ip put:=\033[0m" ${arg#*=}
local_ip=${arg#*=}
wifi_src="Yes"
echo -e "scp robot local ip insert \n --scp:${only_scp_robot}
- -${wifi_src}\n --ip:${local_ip}."
fi
${arg:0:3} 意思为从左边第0个字符开始,字符的个数为3个
${arg#*=} 意思为 # 号截取,删除 '='左边字符,保留右边字符。
至于为什么这么使用,以及其他使用的介绍,这里我摘录其他博主的文章给大家做一个简单的分享 摘录自:《shell脚本字符串截取的8种方法》
假设有变量 var=http://www.aaa.com/123.htm.
1. # 号截取,删除左边字符,保留右边字符。
echo ${var#*//}
##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符 即删除 http://www.aaa.com/ 结果是 123.htm
3. %号截取,删除右边字符,保留左边字符
echo ${var%%/*}
%/* 表示从右边开始,删除第一个 / 号及右边的字符
结果是:http://www.aaa.com
4. %% 号截取,删除右边字符,保留左边字符
echo ${var%%/*}
%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符 结果是:http:
5. 从左边第几个字符开始,及字符的个数
echo ${var:0:5}
其中的 0 表示左边第一个字符开始,5 表示字符的总个数。 结果是:http:
6. 从左边第几个字符开始,一直到结束。
echo ${var:7}
其中的 7 表示左边第8个字符开始,一直到结束。 结果是 :www.aaa.com/123.htm
7. 从右边第几个字符开始,及字符的个数
echo ${var:0-7:3}
其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。 结果是:123
8. 从右边第几个字符开始,一直到结束。
echo ${var:0-7}
表示从右边第七个字符开始,一直到结束。 结果是:123.htm
注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)
此外我们也可以使用awk、cut进行截取,这里就不一一列举了。