sh 错误declare not found(echo -e输出了)

本文探讨了在Ubuntu系统中使用dash作为默认shell时遇到的兼容性问题,并提供了两种解决方案:一是通过将脚本解释器从dash更改为bash;二是调整if条件语句中的字符串比较操作符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

按照鸟哥私房菜些的shell编程,但是却出现莫名其妙的问题。

(还有类似echo -e "hello,world",结果竟然连同-e输出了,也是这个问题。-e hello, world)
如:

#测试if else

 

read -p "input y/n? : " yn

if [ $yn == "y" ]; then

        echo "continue;"
elif [ $yn == "n" ]; then
        echo "break;"
else
        echo "pls input sth."
fi

 

 

执行的时候,总是发现提示  [: 12: y: unexpected operator
无奈了,跑到终端下按照shell里的命令输入了下,居然成功了,不禁再一次感叹了下问题的诡异。

最后在网上找到了答案:
第一种:

原文地址:http://www.ylmf.net/read.php?tid=1377788&page=e&fpage=5

因为ubuntu默认的sh是连接到dash的,又因为dash跟bash的不兼容所以出错了.执行时可以把sh换成bash 文件名.sh来执行.成功.dash是什么东西,查了一下,应该也是一种shell,貌似用户对它的诟病颇多.
by the way修改sh默认连接到bash的一种方法:
sudo dpkg-reconfigure dash
选择no即可.

第二种:
在某个论坛看到别人讨论的结果。

将== 改为=就行了,dash判断字符串相等用 的是=。

#!/bin/bash # 配置参数 #packet.sh test_aarch pkt /shares/simhei.ttf SYSROOT="/shares/sysaarch/binary" LDD="/shares/uos2comp/cross/out/bin/aarch64-linux-gnu-ldd --root=$SYSROOT" WORK_DIR="$PWD" # 获取用户执行脚本时的目录 echo " work path = $PWD" EXECUTABLE="$WORK_DIR/$1" # 拼接绝对路径 if [ -f "$EXECUTABLE" ]; then echo "操作文件:$EXECUTABLE" else echo "错误:文件 $EXECUTABLE 不存在" exit 1 fi OUTPUT_DIR="$WORK_DIR/$2" # 输出目录 echo " output dir = $OUTPUT_DIR" LIB_DIR="$OUTPUT_DIR/lib" # 库目录 PLUGIN_DIR="$OUTPUT_DIR/lib/qt5/plugins" # Qt插件目录 QT_PATH="/shares/sysaarch/binary/usr/opt/qt15" # 替换为你的Qt安装路径(交叉编译的Qt目录) # 创建目录结构 mkdir -p "$PLUGIN_DIR" if [ -d $PLUGIN_DIR ] then echo "mkdir is ok $PLUGIN_DIR" else echo "文件不是个目录" exit 1 fi # 复制可执行文件 echo "Copying executable..." cp -rf "$EXECUTABLE" "$OUTPUT_DIR/" # 定义递归收集库依赖的函数 collect_deps() { local lib=$1 # 检查是否已处理过该库 if [[ ! -z "${processed_libs[$lib]}" ]]; then return fi processed_libs[$lib]=1 # 获取当前库的依赖 local deps=$($$LDD "$lib" 2>/dev/null | awk '/=>/ {if ($3 ~ /^\//) print $3}') # 递归处理每个依赖 for dep in $deps; do # 只处理真实存在的文件(过滤虚拟库如linux-vdso.so) if [ -f "$dep" ]; then all_deps+=("$dep") collect_deps "$dep" fi done } declare -A processed_libs=() # 记录已处理库防止重复 all_deps=() # 存储所有依赖库路径 echo "Collecting libraries..." # 首先收集直接依赖 direct_deps=$($LDD "$EXECUTABLE" | awk ' /=>/ {if ($3 ~ /^\//) print $3} /not found/ {print "ERROR: Library not found: "$1 > "/dev/stderr"; exit 1}') # 递归收集所有间接依赖 for dep in $direct_deps; do direct_dep_lib="$SYSROOT$dep" echo "direct_deps $direct_dep_lib" if [ -f "$direct_dep_lib" ]; then echo "add deps $direct_dep_lib" all_deps+=("$direct_dep_lib") collect_deps "$direct_dep_lib" fi done # 去重并格式化输出 sorted_deps=$(printf "%s\n" "${all_deps[@]}" | sort -u | tr '\n' ' ') echo "All dependencies: $sorted_deps" # 过滤并复制非系统库 echo "Copying dependencies..." for lib in $sorted_deps; do # 排除系统库(根据实际需求调整) #if [[ $lib == /lib* || $lib == /usr/lib* ]]; then # echo "Skipping system library: $lib" #else # 拼接完整的库路径 #full_lib_path="$SYSROOT$lib" # 计算相对路径(去掉sysroot前缀) #relative_path="${full_lib_path#$SYSROOT}" # 去掉开头的斜杠 #relative_path="${relative_path#/}" # 创建目标目录并复制文件 #if [ -e "$full_lib_path" ]; then # #mkdir -p "$(dirname "$LIB_DIR/$relative_path")" # cp -afL "$full_lib_path" "$LIB_DIR/$relative_path" # echo "Copied: $full_lib_path -> $LIB_DIR/$relative_path" #else # echo "ERROR: $full_lib_path does not exist" # exit 1 #fi echo "Copied: $lib -> $LIB_DIR" cp -afL "$lib" "$LIB_DIR/" #fi done # 复制Qt插件 echo "Copying Qt plugins..." qt_plugins=( platforms imageformats # 添加其他需要的插件类型 ) for plugin in "${qt_plugins[@]}"; do src="$QT_PATH/plugins/$plugin" if [ -d "$src" ]; then mkdir -p "$PLUGIN_DIR/$plugin" cp -afL "$src"/*.so "$PLUGIN_DIR/$plugin/" fi done # 创建qt.conf文件(可选) echo "Creating qt.conf..." cat > "$OUTPUT_DIR/qt.conf" << EOF [Paths] Prefix = . Plugins = lib/qt5/plugins Libraries = lib Fonts = lib/fonts EOF cat > "$OUTPUT_DIR/run.sh" << EOF export QT_DEBUG_PLUGINS=1 export LD_LIBRARY_PATH=\$PWd:\$LD_LIBRARY_PATH export QT_QPA_PLATFORM_PLUGIN_PATH=./lib/qt5/plugins/platforms export QT_QPA_PLATFORM=xcb ./${EXECUTABLE##*/} EOF mkdir -p "$OUTPUT_DIR/lib/fonts" cp "$3" "$OUTPUT_DIR/lib/fonts/" echo "----------qt.conf---------------" cat $OUTPUT_DIR/qt.conf echo "---------run.sh----------------" cat $OUTPUT_DIR/run.sh echo "-------------------------------" chmod +x "$OUTPUT_DIR/run.sh" echo "Packaging complete! Output directory: $OUTPUT_DIR" 怎么修改这个shell可以把直接依赖库的依赖库找出来,并复制到lib下
03-21
重新打开linux系统中终端报错declare -x COLORTERM="truecolor" declare -x DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus" declare -x DESKTOP_SESSION="ubuntu" declare -x DISPLAY=":0" declare -x GDMSESSION="ubuntu" declare -x GENICAM_GENTL64_PATH="/opt/spinnaker/lib/spinnaker-gentl" declare -x GNOME_DESKTOP_SESSION_ID="this-is-deprecated" declare -x GNOME_SETUP_DISPLAY=":1" declare -x GNOME_SHELL_SESSION_MODE="ubuntu" declare -x GNOME_TERMINAL_SCREEN="/org/gnome/Terminal/screen/8453c6d3_fd31_4d55_9ed4_f6d62c17b63d" declare -x GNOME_TERMINAL_SERVICE=":1.113" declare -x GTK_MODULES="gail:atk-bridge" declare -x HOME="/home/s" declare -x IM_CONFIG_PHASE="1" declare -x LANG="en_US.UTF-8" declare -x LESSCLOSE="/usr/bin/lesspipe %s %s" declare -x LESSOPEN="| /usr/bin/lesspipe %s" declare -x LOGNAME="s" declare -x LS_COLORS="rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:" declare -x OLDPWD declare -x PATH="/opt/spinnaker/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/custom/bin" declare -x PWD="/home/s" declare -x QT_ACCESSIBILITY="1" declare -x QT_IM_MODULE="ibus" declare -x SESSION_MANAGER="local/s-virtual-machine:@/tmp/.ICE-unix/1684,unix/s-virtual-machine:/tmp/.ICE-unix/1684" declare -x SHELL="/bin/bash" declare -x SHLVL="1" declare -x SPINNAKER_GENTL64_CTI="/opt/spinnaker/lib/spinnaker-gentl/Spinnaker_GenTL.cti" declare -x SSH_AGENT_LAUNCHER="gnome-keyring" declare -x SSH_AUTH_SOCK="/run/user/1000/keyring/ssh" declare -x SYSTEMD_EXEC_PID="1907" declare -x TERM="xterm-256color" declare -x USER="s" declare -x USERNAME="s" declare -x VTE_VERSION="6800" declare -x WAYLAND_DISPLAY="wayland-0" declare -x XAUTHORITY="/run/user/1000/.mutter-Xwaylandauth.ELTY92" declare -x XDG_CONFIG_DIRS="/etc/xdg/xdg-ubuntu:/etc/xdg" declare -x XDG_CURRENT_DESKTOP="ubuntu:GNOME" declare -x XDG_DATA_DIRS="/usr/share/ubuntu:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop" declare -x XDG_MENU_PREFIX="gnome-" declare -x XDG_RUNTIME_DIR="/run/user/1000" declare -x XDG_SESSION_CLASS="user" declare -x XDG_SESSION_DESKTOP="ubuntu" declare -x XDG_SESSION_TYPE="wayland" declare -x XMODIFIERS="@im=ibus" expot: command not found declare -x COLORTERM="truecolor" declare -x DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus,guid=9a8360f17b64c98b11051c9668722b77" declare -x DESKTOP_SESSION="ubuntu" declare -x DISPLAY=":0" declare -x GDMSESSION="ubuntu" declare -x GENICAM_GENTL64_PATH="/opt/spinnaker/lib/spinnaker-gentl" declare -x GNOME_DESKTOP_SESSION_ID="this-is-deprecated" declare -x GNOME_SETUP_DISPLAY=":1" declare -x GNOME_SHELL_SESSION_MODE="ubuntu" declare -x GNOME_TERMINAL_SCREEN="/org/gnome/Terminal/screen/8453c6d3_fd31_4d55_9ed4_f6d62c17b63d" declare -x GNOME_TERMINAL_SERVICE=":1.113" declare -x GTK_MODULES="gail:atk-bridge" declare -x HOME="/home/s" declare -x IM_CONFIG_PHASE="1" declare -x LANG="en_US.UTF-8" declare -x LESSCLOSE="/usr/bin/lesspipe %s %s" declare -x LESSOPEN="| /usr/bin/lesspipe %s" declare -x LOGNAME="s" declare -x LS_COLORS="rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.webp=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:" declare -x OLDPWD declare -x PATH="/opt/spinnaker/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/snap/bin:/custom/bin" declare -x PWD="/home/s" declare -x QT_ACCESSIBILITY="1" declare -x QT_IM_MODULE="ibus" declare -x SESSION_MANAGER="local/s-virtual-machine:@/tmp/.ICE-unix/1684,unix/s-virtual-machine:/tmp/.ICE-unix/1684" declare -x SHELL="/bin/bash" declare -x SHLVL="1" declare -x SPINNAKER_GENTL64_CTI="/opt/spinnaker/lib/spinnaker-gentl/Spinnaker_GenTL.cti" declare -x SSH_AGENT_LAUNCHER="gnome-keyring" declare -x SSH_AUTH_SOCK="/run/user/1000/keyring/ssh" declare -x SYSTEMD_EXEC_PID="1907" declare -x TERM="xterm-256color" declare -x USER="s" declare -x USERNAME="s" declare -x VTE_VERSION="6800" declare -x WAYLAND_DISPLAY="wayland-0" declare -x XAUTHORITY="/run/user/1000/.mutter-Xwaylandauth.ELTY92" declare -x XDG_CONFIG_DIRS="/etc/xdg/xdg-ubuntu:/etc/xdg" declare -x XDG_CURRENT_DESKTOP="ubuntu:GNOME" declare -x XDG_DATA_DIRS="/usr/share/ubuntu:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop" declare -x XDG_MENU_PREFIX="gnome-" declare -x XDG_RUNTIME_DIR="/run/user/1000" declare -x XDG_SESSION_CLASS="user" declare -x XDG_SESSION_DESKTOP="ubuntu" declare -x XDG_SESSION_TYPE="wayland" declare -x XMODIFIERS="@im=ibus"
07-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值