انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => برنامه‌سازی => نویسنده: Droid در 16 بهمن 1394، 12:56 ب‌ظ

عنوان: (bash script) چاپ شدن خروجی دستور بجای ذخیره شدن خروجی در متغیر (حل شد)
ارسال شده توسط: Droid در 16 بهمن 1394، 12:56 ب‌ظ
میخوام خروجی دستور توی متغیر ذخیره بشه، ولی هم اینکه چاپ میشه (دقیقا تمام مقدار متغیر manifest رو میده بیرون) ، بعد هم که متعیر label رو چاپ میکنم هیچی دیده نمیشه.
label=$(grep -Po "(?<=application: label=')(.+?)(?=')" "$manifest")
این شکلی هم نوشتم، که چیزی چاپ نمیکنه ولی مقدار label مثل بالا خالیه.
label="$( <<EOF
grep -Po "(?<=application: label=')(.+?)(?=')" "$manifest"
EOF
)"

بازم  ](*,)
عنوان: پاسخ : (bash script) چاپ شدن خروجی دستور بجای ذخیره شدن خروجی در متغیر
ارسال شده توسط: 藤沼 در 16 بهمن 1394، 02:35 ب‌ظ
محتوای manifest چیه؟ خطی که در اون تعریف شده رو بگذارید.
عنوان: پاسخ : (bash script) چاپ شدن خروجی دستور بجای ذخیره شدن خروجی در متغیر
ارسال شده توسط: Droid در 16 بهمن 1394، 02:47 ب‌ظ
همونی که توی سوال قبلیم (http://forum.ubuntu.ir/index.php/topic,130516.0.html) روش regex مینوشتم یعنی لینک (http://paste.ubuntu.com/14886481/)

البته بعد نوشتن سوال اینجوری حلش کردم \\:D/ ، در کل میخواستم یه اسکریپت بنویسم که فایلهای apk رو دسته جمعی بر اساس یه سری مقادیر داخل manifest ش تغییر نام بدم که مرتب بشن، به هدفم رسیدم (البته جا برای کامل تر و بهتر کردن داره)، ولی خب دوست دارم اتفاقی که میفتاد رو بدونم.


#!/bin/bash
rename_move() {
    ./aapt debug badging "$1" > temp
    label=$(cat temp | grep -Po "(?<=application: label=')(.+?)(?=')")
    package=$(cat temp | grep -Po "(?<=package: name=')(.+?)(?=')")
    version_code=$(cat temp | grep -Po "(?<=versionCode=')(.+?)(?=')")
    version_name=$(cat temp | grep -Po "(?<=versionName=')(.+?)(?=')")
    mv -f "$1" "$label - $version_name - $version_code - $package.apk"
}

for f in *.apk
do
    rename_move "$f"
done

محتوای manifest چیه؟ خطی که در اون تعریف شده رو بگذارید.

اینجوری مینوشتم:
manifest=$(./aapt debug badging "$1")
label=$(grep -Po "(?<=application: label=')(.+?)(?=')" "$manifest")
عنوان: پاسخ : (bash script) چاپ شدن خروجی دستور بجای ذخیره شدن خروجی در متغیر
ارسال شده توسط: 藤沼 در 16 بهمن 1394، 04:43 ب‌ظ
اینجا اشتباه کردی و یک جریان (Stream) رو به‌عنوان فایل به grep دادی:
# wrong
label=$(grep -Po "(?<=application: label=')(.+?)(?=')" "$manifest")
# correct
label=$(echo "$manifest" | grep -Po "(?<=application: label=')(.+?)(?=')")
می‌تونی از نمونهٔ‌ زیر هم استفاده کنی. البته استفاده از این نوع تابع‌ها برای من کلاً اشتباست:
#!/usr/bin/env bash
# filename: manifest.sh

parse() {
    local na="(?<=package: name=')(.+?)(?=')"
    local la="(?<=application: label=')(.+?)(?=')"
    local vc="(?<=versionCode=')(.+?)(?=')"
    local vn="(?<=versionName=')(.+?)(?=')"

    name=$(grep -Po "$na" "$1")
    label=$(grep -Po "$la" "$1")
    version_code=$(grep -Po "$vc" "$1")
    version_name=$(grep -Po "$vn" "$1")
}

rename() {
    mv -f "$1" "$label - $version_name - $version_code - $name.apk"
}

reform() {
    parse "$1"
    rename "$1"
}

find . -iname '*.apk' | while read -r filename; do
    reform "$filename"
done
عنوان: پاسخ : (bash script) چاپ شدن خروجی دستور بجای ذخیره شدن خروجی در متغیر (حل شد)
ارسال شده توسط: احسان فعالپور در 16 بهمن 1394، 11:49 ب‌ظ
میتونید اینها رو مطالعه کنید:
لینک ۱ (http://stackoverflow.com/questions/12451278/bash-capture-stdout-to-a-variable-but-still-display-it-in-the-console)
لینک ۲ (http://tldp.org/LDP/abs/html/io-redirection.html)
عنوان: پاسخ : (bash script) چاپ شدن خروجی دستور بجای ذخیره شدن خروجی در متغیر (حل شد)
ارسال شده توسط: Droid در 17 بهمن 1394، 05:52 ب‌ظ
از راهنمایی های هر دو عزیز ممنونم  :)

پی نوشت ندارم
پی لینک (http://forum.ubuntu.ir/index.php/topic,17327.msg528642.html#msg528642)