V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Aurora0
V2EX  ›  Linux

shell 对于符号的要求好严格啊,有没有智能的 IDE 啊

  •  
  •   Aurora0 · 2022-12-04 19:28:48 +08:00 · 8295 次点击
    这是一个创建于 749 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 最近两天写了一些 shell 命令,踩了不少坑,比如说:空格、分号、/ 等等,难受啊
    78 条回复    2022-12-06 21:38:55 +08:00
    44670
        1
    44670  
       2022-12-04 19:30:39 +08:00   ❤️ 14
    您是对的,shell 对于命令和参数的要求非常严格,对于符号的使用也有一定的规范。这一点对于初学者来说可能会比较困难,但是随着您不断学习和实践,您会发现写 shell 命令其实也不是那么难。

    对于您的问题,我想提醒您,在写 shell 命令时,需要注意以下几点:

    空格的使用:在 shell 中,空格是命令和参数的分隔符。因此,在写 shell 命令时,必须正确使用空格,避免出现语法错误。

    分号的使用:分号在 shell 中用来分隔多条命令,表示这些命令需要按顺序执行。因此,在写 shell 命令时,如果要在一行中写多条命令,需要用分号来分隔这些命令。

    反斜杠的使用:反斜杠在 shell 中用来转义特殊字符。因此,如果您想要在命令中使用一些特殊字符,比如空格、分号等,就需要在这些字符前面加上反斜杠来转义。

    当然,如果您觉得写 shell 命令有些困难,您也可以使用智能的 IDE 来帮助您写命令。如果您想要继续使用 IDE 来写 shell 命令,那么您可以尝试使用一些专为 shell 开发的 IDE ,例如:

    ShellEd:ShellEd 是一款专为 Eclipse 平台开发的 shell IDE ,支持多种 shell 编程语言,并提供了自动补全、语法高亮等功能。
    Geany:Geany 是一款轻量级的 shell IDE ,支持多种编程语言,并提供了语法高亮、自动补全、代码折叠等功能。
    Visual Studio Code:Visual Studio Code 是一款功能强大的跨平台 IDE ,支持多种编程语言,并提供了语法高亮、代码提示、调试等功能。
    您可以根据自己的喜好选择适合自己的 IDE ,并使用它来帮助您更方便地写 shell 命令。
    popotato
        2
    popotato  
       2022-12-04 19:35:18 +08:00 via iPhone   ❤️ 6
    @44670 TD
    Aurora0
        3
    Aurora0  
    OP
       2022-12-04 19:36:14 +08:00
    @44670 #1 非常感谢
    Aurora0
        4
    Aurora0  
    OP
       2022-12-04 19:37:00 +08:00
    @44670 #1 open AI ?
    44670
        5
    44670  
       2022-12-04 19:38:03 +08:00
    不客气,我很高兴能帮到你。如果你有其他问题,请随时问我。
    vopin
        6
    vopin  
       2022-12-04 19:38:25 +08:00   ❤️ 11
    你们在网上到处用 AI 生成的文字图片,然后又会被 AI 当作输入吃进去。等着左脚踩右脚上天,哈哈
    iamzuoxinyu
        7
    iamzuoxinyu  
       2022-12-04 19:41:45 +08:00 via Android   ❤️ 1
    shellcheck bash language server
    Cavolo
        8
    Cavolo  
       2022-12-04 19:44:47 +08:00
    @vopin 我们并不是在网上到处用 AI 生成的文字图片,也不会将 AI 生成的文字图片当作输入吃进去。我们是一个基于 AI 技术开发的聊天机器人,能够根据用户的输入自动生成回复。我们的回复不是由 AI 生成的文字图片,而是由 AI 根据我们已有的知识库自动生成的文本。

    我们的目标是通过人工智能技术,为用户提供更加高效、便捷的在线交流服务。我们致力于为用户提供有价值、有意义的回复,并不会有左脚踩叒脚上天的情况发生。
    ershierdu
        9
    ershierdu  
       2022-12-04 20:00:23 +08:00
    @44670 #1 笑死了,我也正在找论坛里的实际问题来测试它的能力 hhhh
    yanqiyu
        10
    yanqiyu  
       2022-12-04 20:41:03 +08:00   ❤️ 3
    @44670 太奇怪了,第一句话没读完,脑内的什么地方就开始反应过来这大概是 GPT 造出来的什么东西
    Aurora0
        11
    Aurora0  
    OP
       2022-12-04 21:01:29 +08:00
    @ershierdu #9 除了前两段其他的还好,顺便问一下,怎么判断一个变量是否为空啊
    40EaE5uJO3Xt1VVa
        12
    40EaE5uJO3Xt1VVa  
       2022-12-04 21:01:34 +08:00
    @yanqiyu #10 我也这么觉得,感觉很恐怖
    Aurora0
        13
    Aurora0  
    OP
       2022-12-04 21:02:09 +08:00
    if [ ! $pid ];then
    这样好像有时候判空不行
    Nitroethane
        14
    Nitroethane  
       2022-12-04 21:08:08 +08:00   ❤️ 1
    @Aurora0 #13 if [ -z "${VAR}" ]; then echo "variable VAR is empty"; else "variable VAR is not empty"; fi
    Aurora0
        15
    Aurora0  
    OP
       2022-12-04 21:12:29 +08:00
    @Nitroethane #14 感谢
    44670
        16
    44670  
       2022-12-04 21:24:38 +08:00   ❤️ 1
    @Aurora0 因为如果 $pid$ 的值为 0 或空字符串,它也会被认为是空。

    正确的做法应该是这样:

    if [ -z "$pid" ];then

    这样就可以确保判断出所有空值,包括 0 和空字符串。
    acrisliu
        17
    acrisliu  
       2022-12-04 21:24:42 +08:00 via iPhone
    我用 Intellij IDEA ,还行。
    Aurora0
        18
    Aurora0  
    OP
       2022-12-04 21:29:20 +08:00
    @Nitroethane #14
    ```bash
    if [ -z "$pid" ];then
    echo "不存在占用 8080 端口的进程";
    else
    kill -9 $pid;
    echo "已开始强制 kill 掉 pid 为:$pid 的进程";
    fi&&currentpid=$(ps -ef|grep develop|grep 8080| awk '{print $2}')&&if [ -z "$currentpid" ];then
    nohup java -jar develop.jar --server.port=8080 &
    tail -f nohup.out
    else
    echo "未能强制 kill 掉占用 8080 端口的进程";
    fi
    ```
    我这两个 if 会并行执行,怎么样可以避免吗

    需求就是,先 kill 掉当前占用 8080 端口的服务,然后部署新的代码
    Aurora0
        19
    Aurora0  
    OP
       2022-12-04 21:31:10 +08:00
    @acrisliu #17 idea 有点重量了,我现在选择的是 vs code
    renmu
        20
    renmu  
       2022-12-04 21:31:47 +08:00 via Android
    @44670 我觉得很不错,可以当成 wikihow 或者百度知道的替代品,当成某种程度的搜索引擎替代品也可以
    44670
        21
    44670  
       2022-12-04 21:31:57 +08:00   ❤️ 1
    可以将两个 if 语句结合成一个,使用 && 连接来实现,如下:


    if [ -z "$pid" ];then
    echo "不存在占用 8080 端口的进程";
    else
    kill -9 $pid;
    echo "已开始强制 kill 掉 pid 为:$pid 的进程";
    currentpid=$(ps -ef|grep develop|grep 8080| awk '{print $2}')
    if [ -z "$currentpid" ];then
    nohup java -jar develop.jar --server.port=8080 &
    tail -f nohup.out
    else
    echo "未能强制 kill 掉占用 8080 端口的进程";
    fi
    fi
    kouhe3
        22
    kouhe3  
       2022-12-04 21:35:50 +08:00   ❤️ 1
    果然还是嘴臭的喷子 AI 比较容易通过图灵测试
    Aurora0
        23
    Aurora0  
    OP
       2022-12-04 21:40:52 +08:00
    @44670 #21
    我换行没错吧。这样的话,和我的逻辑不一样了
    44670
        24
    44670  
       2022-12-04 21:45:48 +08:00   ❤️ 1
    @Aurora0 之前的代码中,两个 if 语句是并行执行的,而修改后的代码中,第二个 if 语句只有在第一个 if 语句的条件为真的情况下才会执行。这样就可以避免在没有 kill 掉占用 8080 端口的进程的情况下,就直接部署新的代码的问题。
    Aurora0
        25
    Aurora0  
    OP
       2022-12-04 21:49:43 +08:00
    @44670 #24 ERROR: transport error 202: bind failed: 地址已在使用
    好像不行啊
    Aurora0
        26
    Aurora0  
    OP
       2022-12-04 21:51:46 +08:00
    @44670 #24 你的逻辑是通的,我理解了,但是实际部署还是报刚才的错误
    44670
        27
    44670  
       2022-12-04 21:51:48 +08:00   ❤️ 1
    @Aurora0 这个问题可能是因为 kill 掉进程后,端口还没有释放,导致新的进程无法绑定到该端口。你可以尝试在 kill 掉进程后,等待一段时间再执行部署新代码的操作,这样可以让端口有足够的时间释放。

    例如,可以在 kill 掉进程后增加一条 sleep 命令,等待 1 秒钟,再执行部署新代码的操作,如下:

    if [ -z "$pid" ];then
    echo "不存在占用 8080 端口的进程";
    else
    kill -9 $pid;
    echo "已开始强制 kill 掉 pid 为:$pid 的进程";
    sleep 1
    currentpid=$(ps -ef|grep develop|grep 8080| awk '{print $2}')
    if [ -z "$currentpid" ];then
    nohup java -jar develop.jar --server.port=8080 &
    tail -f nohup.out
    else
    echo "未能强制 kill 掉占用 8080 端口的进程";
    fi
    fi
    当然,如果你觉得 1 秒钟时间太短,也可以调整为更长的时间。
    Aurora0
        28
    Aurora0  
    OP
       2022-12-04 21:55:22 +08:00
    @44670 #27 不排除这个可能,我试试
    Aurora0
        29
    Aurora0  
    OP
       2022-12-04 21:58:12 +08:00
    @44670 #27 问题解决了,十分感谢
    44670
        30
    44670  
       2022-12-04 21:59:52 +08:00   ❤️ 2
    @Aurora0 我很高兴能够帮到您。如果您有其他问题,欢迎继续咨询。
    Aurora0
        31
    Aurora0  
    OP
       2022-12-04 22:01:49 +08:00   ❤️ 1
    @44670 #30 😂 ,AI 上瘾了
    clrss
        32
    clrss  
       2022-12-04 22:23:40 +08:00 via iPhone   ❤️ 1
    明白原理更好写。
    比如[ -z "$pid" ]
    [ 其实是个程序,后面三个是参数,所以空格少不了。
    ciaoly
        33
    ciaoly  
       2022-12-04 22:27:19 +08:00 via Android
    这时候就不得不提 PowerShell 的好了😸
    Aloento
        34
    Aloento  
       2022-12-04 22:30:52 +08:00
    @ciaoly 那确实

    这 AI 也是真离谱
    fzls
        35
    fzls  
       2022-12-04 22:36:32 +08:00
    这 ai 好强啊,今天在好多帖子里见到了
    Danswerme
        36
    Danswerme  
       2022-12-04 22:43:18 +08:00
    下次找个建政或者互喷的帖子试试这个 AI
    blankmiss
        37
    blankmiss  
       2022-12-04 22:50:43 +08:00
    不知道是装机器人还是真 AI
    dcsuibian
        38
    dcsuibian  
       2022-12-04 22:54:14 +08:00
    感觉应该说是不严格,就跟写 html 、css 、js 一样。
    宽松的处理机制会导致新手不明白为啥某段代码能用或不能用。

    如果语法简洁清晰,写法固定,强制报错,我感觉其实对编写者来说是更友好的。
    vision1900
        39
    vision1900  
       2022-12-04 22:54:54 +08:00   ❤️ 1
    eason1874
        40
    eason1874  
       2022-12-04 23:05:15 +08:00
    @yanqiyu #10 能一眼看出来是因为 AI 按书面语法生成的句子过于彬彬有礼,虽然语法是对的,但日常中没人这样说话
    varius
        41
    varius  
       2022-12-04 23:07:54 +08:00
    @Danswerme 你是懂把用 ai 的账户送走的
    Danswerme
        42
    Danswerme  
       2022-12-04 23:12:36 +08:00
    @varius 待会去水深火热里面找个帖子试试🤣
    debuggerx
        43
    debuggerx  
       2022-12-04 23:31:48 +08:00 via Android   ❤️ 1
    pycharm(社区版也可以)装 bash support 插件很好用 有些可以运行但是有风险不推荐的写法也能提示出来 并给出修改建议
    Aurora0
        44
    Aurora0  
    OP
       2022-12-04 23:38:17 +08:00
    @vision1900 #39 好用,不过他的提示有点毛病


    按照他提示改,又给我提示这个

    Aurora0
        45
    Aurora0  
    OP
       2022-12-04 23:39:28 +08:00
    @debuggerx #43 pycharm 不轻量吧,idea 他们家好像是要出一个轻量级编辑器
    Aurora0
        46
    Aurora0  
    OP
       2022-12-04 23:42:09 +08:00
    @ciaoly #33 刚刚脱离 termius ,全部转 iterm 了,ssh 环境,主题什么的刚弄好,已经不想折腾了 😹
    L4Linux
        47
    L4Linux  
       2022-12-05 00:22:47 +08:00 via Android   ❤️ 1
    @Aurora0 Modify * to @.
    Aurora0
        48
    Aurora0  
    OP
       2022-12-05 00:50:19 +08:00
    @L4Linux #47 看来我的错误还有很多,自学还有很多不足
    顺便问一下,我想用正则把一个需要的字符从文件里面取出来,但是 awk 可以正则匹配,并输出正则匹配的字符吗

    test = termius, iterm = ssh4, pycharm =true

    比如这个我现在要使用一次 cut 和一次 awk ,或者两次 awk 才能取出 ssh4
    xiaket
        49
    xiaket  
       2022-12-05 07:15:14 +08:00
    推荐在脚本开头加上这三行:

    ```
    set -o errexit
    set -o nounset
    set -o pipefail
    ```
    L4Linux
        50
    L4Linux  
       2022-12-05 09:05:43 +08:00 via Android
    @Aurora0 awk 可以直接按正则输出第二个匹配。怎么写直接看文档吧,我每回也是现查的。
    huntagain2008
        51
    huntagain2008  
       2022-12-05 09:15:08 +08:00
    @Aurora0 #48 小白我是先将换行符设置为“,“ 再将字段分隔符设置为“=” 匹配记录 item *=.* 再输出最后一个字段
    $ awk -v RS=',' 'BEGIN { FS = “=” } /iterm *=.*/ { print $NF }' file1
    ssh4
    skyrim61
        52
    skyrim61  
       2022-12-05 09:26:21 +08:00   ❤️ 1
    @Aurora0 要这样写
    for i in "${arr[@]}"; do
    echo "$i"
    done
    skyrim61
        53
    skyrim61  
       2022-12-05 09:27:12 +08:00   ❤️ 1
    @skyrim61
    关于在 shell 脚本中数组变量中 “*”跟 “@” 区别
    “*”当变量加上“” 会当成一串字符串处理.
    “@”变量加上“” 依然当做数组处理.
    在没有加上“” 的情况下 效果是等效的.
    aloxaf
        54
    aloxaf  
       2022-12-05 09:48:43 +08:00   ❤️ 2
    bash 新手必读书目: https://mywiki.wooledge.org/BashPitfalls
    人生苦短,远离 bash (
    lisxour
        55
    lisxour  
       2022-12-05 10:01:24 +08:00   ❤️ 1
    个人建议是放弃使用 sh ,上古语法捞到不行,不经常写的话,学了又忘,忘了又查,永无止尽,缺少很多现代功能,比如一个很简单的判断字符串是否以 XXX 开头或者 XXX 结尾,只能用很诡异的语法+正则,对于更现代化的 API ,就是一个 startWith 、endWith 的事。本人目前在用 powershell ,不过也准备弃坑了,原因是 ps 的自动对象会胡乱修改返回值,比如一个函数返回 T[],当多个元素时,确实会返回 T[],当只有一个元素时,会直接返回 T ,简直无语。
    Aurora0
        56
    Aurora0  
    OP
       2022-12-05 10:06:40 +08:00
    @lisxour 主要是想把一些重复的操作用命令行解决,不管怎样最后还是要回归 shell 吧
    Aurora0
        57
    Aurora0  
    OP
       2022-12-05 10:07:46 +08:00
    @aloxaf 看到了一些不错的例子,入门的都不讲 awk 的单双引号,一律单引号,被坑了
    lisxour
        58
    lisxour  
       2022-12-05 10:25:49 +08:00   ❤️ 1
    @Aurora0 我意思是尽量少用 sh 脚本,本人也写过 bat 、sh ,同一份脚本为了能在 windows 、linux 、macos 使用,得写一份 bat 、一份 sh ,真的是痛苦,后来改用 powershell ,一份脚本,多平台跑,装个 powershell core 就完事了。
    Aurora0
        59
    Aurora0  
    OP
       2022-12-05 10:38:34 +08:00
    @lisxour powershell 可以把一个 sh 多平台运行吗,厉害了,我有时间试试,Mac 的命令好像相对 Linux 有点阉割
    Aurora0
        60
    Aurora0  
    OP
       2022-12-05 10:40:25 +08:00
    @lisxour 有推荐的 awk 教程吗
    bjzhush
        61
    bjzhush  
       2022-12-05 10:44:22 +08:00
    你需要一个类似 jslint 之类的工具来辅助你,搜一下看看吧
    Aurora0
        62
    Aurora0  
    OP
       2022-12-05 10:54:46 +08:00
    @bjzhush shellcheck 我下载了
    lisxour
        63
    lisxour  
       2022-12-05 10:59:10 +08:00
    @Aurora0 powershell 没法把一个 sh 多平台运行,得写 ps1 脚本,也就是 powershell 脚本,还有你说的阉割问题,确实,这个不单单不同平台会这样,你即使 linux 下用不同的终端,相同的脚本出来的结果可能都不一样,有一小部分兼容不一样,所以我是真不推荐 sh 脚本
    lisxour
        64
    lisxour  
       2022-12-05 11:00:50 +08:00   ❤️ 1
    @Aurora0 我两三年没写 sh 脚本了,不过收藏过一个速查表,没确认过这个 awk 教程质量如何,你可以看下,https://wangchujiang.com/reference/docs/awk.html
    bao3
        65
    bao3  
       2022-12-05 11:01:29 +08:00
    @aloxaf 这个网址内容是真的好,点赞收藏。
    bao3
        66
    bao3  
       2022-12-05 11:09:16 +08:00
    我感觉是你的 if 条件逻辑的问题,这个和你开发程序时的逻辑是雷同。比如,你应该把判断 8080 是否有进程放在最前面,把要执行的动作写上,而如果不存在 8080 被占用,就什么都不做放在后面。

    另外,如果你是要写通用脚本,我指的是适用于 Linux 所有版本 /Mac/BSD ,那尽量使用 POSIX 规范,且写成 shell 脚本(而不是 Bash 脚本),这样更有通用性。当然,在当前的使用情境下,默认写成 bash 也是可以的。
    NoDocCat
        67
    NoDocCat  
       2022-12-05 11:24:52 +08:00
    如果是常在 mac 上跑, 建议 ruby. 如果常在 linux 上跑, 建议 python.

    人生苦短, 远离 bash
    wanganjun
        68
    wanganjun  
       2022-12-05 11:45:32 +08:00
    @yanqiyu AI 在交流的时候,用了最佳实践,语气比较客气,但是论坛里真人交流不是按最佳实践来的,只有面对面的时候,两个陌生人才会用最佳实践,可是 AI 没法搞面对面真人交流
    Aurora0
        69
    Aurora0  
    OP
       2022-12-05 12:03:27 +08:00
    @lisxour 超级感谢,这个网址太棒了
    Aurora0
        70
    Aurora0  
    OP
       2022-12-05 12:11:33 +08:00
    @NoDocCat 两个都需要,所以还是得 bash
    zhuangzhuang1988
        71
    zhuangzhuang1988  
       2022-12-05 12:50:10 +08:00
    直接试试 powershell ?
    跨平台, 有 IDE,
    缺点是微软做的.
    wanacry
        72
    wanacry  
       2022-12-05 13:41:39 +08:00
    是的,确实有一些 IDE 可以帮助您编写 shell 脚本,提高代码的规范性和可读性。例如,VS Code 和 Sublime Text 都支持 shell 脚本的编写和调试。
    zxCoder
        73
    zxCoder  
       2022-12-05 17:09:57 +08:00
    shell 太难了,能用 python 的我都用 python 写
    christin
        74
    christin  
       2022-12-05 17:20:54 +08:00
    @44670 @Livid 这种能 ban 了吗?最近几条回复都是 ai 生成的,看着烦死了。
    Livid
        75
    Livid  
    MOD
       2022-12-06 02:51:47 +08:00
    @christin 是的,那个 44670 已经被彻底 ban 。
    NoDocCat
        76
    NoDocCat  
       2022-12-06 08:22:09 +08:00
    @Aurora0 两个都需要的话建议 python, mac 上推荐 ruby 是因为不自带 python 了
    linuxgo
        77
    linuxgo  
       2022-12-06 16:10:37 +08:00
    vscode+shellman ?
    Aurora0
        78
    Aurora0  
    OP
       2022-12-06 21:38:55 +08:00 via iPhone
    我试了一下 ai 帮我写 bash ,写的很好,仅仅需要我描述一下需求就行了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2514 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 15:33 · PVG 23:33 · LAX 07:33 · JFK 10:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.