在bash脚本中${foo#?}是什么意思?

在bash脚本中${foo#?}是什么意思?,bash,Bash,有人能告诉我下面这行是什么吗 tmp="${dirname#?} 正在执行以下脚本中的操作: #!/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

有人能告诉我下面这行是什么吗

tmp="${dirname#?} 
正在执行以下脚本中的操作:

#!/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 "$@"
它似乎删除了前导的“/”,但我找不到#的任何文档?运算符。

${var#?}
展开为
$var
的值,并删除第一个字符

通常,
${var#substring}
从变量
$var
的开头删除最短出现的子字符串<代码>?是一个特殊字符,表示任何字符

此功能记录在(查找
${parameter#word}
)。

${var#?}
扩展为
$var
的值,删除第一个字符

通常,
${var#substring}
从变量
$var
的开头删除最短出现的子字符串<代码>?是一个特殊字符,表示任何字符



此功能记录在(查找
${parameter#word}
)。

提示:在这种情况下,编写
${dirname#/}
是一种更通用的方法,在这个用例中,它可能更可读、更安全。请参阅“参数扩展”部分的
${parameter#word}
这里只是匹配任何单个字符的模式元字符。顺便说一句,这里有一些关于缺少引用的错误(会抓住它们),使用
sed
这里很愚蠢;如果您打算使用
basename
,为什么不让它也关闭扩展?也就是说:
appname=$(basename“$0.sh)
如果您打算使用外部工具,或者:
appname=${0##*/};appname=${0%.sh}
否则。提示:在这种情况下,编写
${dirname#/}
是一种更通用的方法,可以说在这种用例中更可读、更安全。请参阅“参数扩展”部分中的手册页,查看
${parameter#word}
这里只是匹配任何单个字符的模式元字符。顺便说一句,这里有一些关于缺少引用的错误(会抓住它们),使用
sed
这里很愚蠢;如果您打算使用
basename
,为什么不让它也关闭扩展?也就是说:
appname=$(basename“$0.sh)
如果您打算使用外部工具,或者:
appname=${0##*/};appname=${0%.sh}
否则。啊,好的。有道理。谢谢顺便问一下:最后一行是怎么做的:$dirname/$appname“$@”它正在执行带有路径
$dirname/$appname
(应该用引号括起来,如
“$dirname/$appname”
)的命令,传递给这个脚本的参数。好的,当最后一个命令执行时,它会在另一个子shell中吗?我这样问是因为,EXPORT命令不会影响当前的shell。@GMahan这是一个单独的过程-它可能是shell脚本这一事实没有任何区别。我的理解是,脚本中设置的任何环境变量在完成时都将丢失。父进程中设置的任何环境变量都应该对子进程可见。啊,好的。有道理。谢谢顺便问一下:最后一行是怎么做的:$dirname/$appname“$@”它正在执行带有路径
$dirname/$appname
(应该用引号括起来,如
“$dirname/$appname”
)的命令,传递给这个脚本的参数。好的,当最后一个命令执行时,它会在另一个子shell中吗?我这样问是因为,EXPORT命令不会影响当前的shell。@GMahan这是一个单独的过程-它可能是shell脚本这一事实没有任何区别。我的理解是,脚本中设置的任何环境变量在完成时都将丢失。父进程中设置的任何环境变量对子进程都应该是可见的。