我遇到了以下脚本:
#!/bin/sh
### Variables ###
porta="3299";
SECUDIR="/usr/sap/saprouter";
SNC_LIB="/usr/sap/saprouter/libsapcrypto.so";
DNAME="p:CN=server, OU=0001000000, OU=SAProuter, O=SAP, C=DE";
### Variables end ###
### Check if saprouter is already running:
pid1="'netstat -nlp | grep '0.0.0.0:"$porta"'.*saprouter' | sed -n 1p | awk '{print $7}' | cut -f1 -d "/" '";
if [ "$pid1" == "" ]
then # Not running.
### check if the port is free:
echo -e "\nChecking port…";
processo="'netstat -nlp | grep 0.0.0.0:"$porta" | sed -n 1p | awk '{print $7}' | cut -f1 -d "/"'";
sleep 2;
# If port free:
if [ -f $processo ]
then
echo -e "\nStarting SAPRouter on port: " $porta;
sleep 2;
export SECUDIR=$SECUDIR
export SNC_LIB=$SNC_LIB
/usr/sap/saprouter/./saprouter -r -R "$SECUDIR/saprouttab" -W 60000 -G "$SECUDIR/saprouterlog.txt" -S $porta -K "$DNAME" &
pid="'netstat -nlp | grep '0.0.0.0:'"$porta"'.*saprouter' | sed -n 1p | awk '{print $7}' | cut -f1 -d "/" '";
echo -e "\n\nSAPRouter is running on PID: "$pid;
echo -e "\n";
exit;
# if the port isnot free.
else
echo -e '——————————————————-\n';
echo -e ' It is not possible to start SAPRouter\n';
echo -e ' The PID: '$processo' is already using the port: ' $porta;
echo -e '——————————————————-\n';
fi
###################
else # Its already running.
echo -e "\nSAPRouter is already running";
pid="'ps -ef | grep saprouter | sed -n 1p | awk '{print $2}' '";
echo -e "\nPID: "$pid;
echo -e "\n";
sleep 2;
fi
我认为存在几个错误。我发现代码这里:有一个注释修复了一些错误,但我认为并非所有错误都已修复。我注意到引号”
,我将其替换为"
。但我仍然收到此错误:
run_router.sh: 12: [: 'netstat -nlp | grep '0.0.0.0:3299'.*saprouter' | sed -n 1p | awk '{print }' | cut -f1 -d / ': unexpected operator
-e
SAPRouter is already running
-e
PID: 'ps -ef | grep saprouter | sed -n 1p | awk '{print }' '
-e
由于我没有使用脚本的经验,我不知道哪个引用的字符串是未终止的,因为这一行有很多引用的字符串:
pid1="'netstat -nlp | grep '0.0.0.0:"$porta"'.*saprouter' | sed -n 1p | awk '{print $7}' | cut -f1 -d "/" '";
你能帮我修复这个脚本吗?
谢谢。
答案1
以下尝试专门解决语法错误。可能还有其他问题导致它无法按您预期的方式工作:例如,
if [ -f $processo ]
测试是否常规文件存在,其名称由变量的内容给出processo
- 但processo
似乎可能包含数字进程 ID (PID)。也许作者的意图是
if [ -n "$processo" ]
测试变量是否非空或(更有可能的是,考虑到上下文)
if [ -z "$processo" ]
测试它是否为空。
当你修正下载脚本的 HTML 格式时,看起来你至少用“错误的” ASCII 字符替换了部分智能引号 - 尤其是
processo="'netstat -nlp | grep 0.0.0.0:"$porta" | sed -n 1p | awk '{print $7}' | cut -f1 -d "/"'";
和
pid="'netstat -nlp | grep '0.0.0.0:'"$porta"'.*saprouter' | sed -n 1p | awk '{print $7}' | cut -f1 -d "/" '";
应该有“反引号”(用于命令替换)而不是常规的直单引号
processo="`netstat -nlp | grep 0.0.0.0:"$porta" | sed -n 1p | awk '{print $7}' | cut -f1 -d "/"`";
pid="`netstat -nlp | grep '0.0.0.0:'"$porta"'.*saprouter' | sed -n 1p | awk '{print $7}' | cut -f1 -d "/" `";
更好的是,将它们更改为更现代的$(...)
结构:
processo="$(netstat -nlp | grep 0.0.0.0:"$porta" | sed -n 1p | awk '{print $7}' | cut -f1 -d "/")";
pid="$(netstat -nlp | grep '0.0.0.0:'"$porta"'.*saprouter' | sed -n 1p | awk '{print $7}' | cut -f1 -d "/" )";