shell 对于符号的要求好严格啊,有没有智能的 IDE 啊 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Aurora0
V2EX    Linux

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

  •  
  •   Aurora0 2022-12-04 19:28:48 +08:00 8994 次点击
    这是一个创建于 1045 天前的主题,其中的信息可能已经有所发展或是发生改变。
    • 最近两天写了一些 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
    PRO
       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     Solana     5772 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 48ms UTC 03:10 PVG 11:10 LAX 20:10 JFK 23:10
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86