🤨
脚本navDebuggingTools.sh
#!/bin/sh
appname=`basename $0 | sed s,\.sh$,,`
dirname=`dirname $0`
tmp="${dirname#?}"
if [ "${dirname%$tmp}" != "/" ]; then
dirname=$PWD/$dirname
fi
LD_LIBRARY_PATH=$dirname
export LD_LIBRARY_PATH
$dirname/$appname "$@"
🤔
第一行
appname=`basename $0 | sed s,\.sh$,,`
左值是个变量,appname
而右值,却被一对反引号包住
反引号的作用是将反引号内的Linux命令先执行,然后将执行结果赋予变量
所以右值还是一条命令,其中basename
是php
中一个函数,返回路径中的文件名部分。
在这里basename $0
,表示返回执行的脚本名,即navDebuggingTools.sh
sed
用来处理,编辑文本
s
表示取代模式
后面的三个逗号,
是用来分割参数的,可用/
取代,
\.sh$
是第一个参数,即要被取代的字符串,\
用来转义.
,$
表示字符串的结束
最后两个,
之间的空字符串就是取代的字符串
第二行
dirname=`dirname $0`
dirname $0
在命令行状态下返回 .
,而在脚本中返回的是脚本所在的路径,且是脚本所在路径相对于命令执行时的路径
第三、四行
将第三行tmp="${dirname#?}"
输出出来,就会发现是空的
接着我写一些例子测试了下
str="12345678"
echo "${str#}" # 输出的是12345678
echo "${str#?????}" # 输出的是678
然后再把if
判断中的${dirname%$tmp}
输出出来,结果是.
,这不就是变量$dirname
的值吗?
这又是%
接一个变量
几经折腾,终于找到了答案
linux shell 字符串 处理 小结
linux shell 字符串替换
最后三行
LD_LIBRARY_PATH=$dirname
export LD_LIBRARY_PATH
$dirname/$appname "$@"
整个脚本,最后三行才是关键
首先,LD_LIBRARY_PATH
是程序在使用中的环境变量
export
就是设定环境变量,注意LD_LIBRARY_PATH
并没有使用$
符号
最后一行就是执行程序了
🙄
其实知道脚本到底要干嘛之后,用很简单的几行代码就能搞定,并不需要像上面的那么复杂
LD_LIBRARY_PATH=$PWD"/" # 程序执行所需的环境变量
export LD_LIBRARY_PATH # 设置环境变量
./navDebuggingTools # 在当前路径执行程序